ウィンドウにデザインタイムのDataContextを設定すると、コンパイラエラーが発生しますか?


203

WPFアプリケーションのメインウィンドウに以下のXAMLがあります。以下のデザインタイムを設定しようとしていd:DataContextます。これは、すべてのさまざまなUserControlに対して正常に実行できますが、窓...

Error 1 The property 'DataContext' must be in the default namespace or in the element namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'. Line 8 Position 9. C:\dev\bplus\PMT\src\UI\MainWindow.xaml 8 9 UI

<Window x:Class="BenchmarkPlus.PMT.UI.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:UI="clr-namespace:BenchmarkPlus.PMT.UI"
    xmlns:Controls="clr-namespace:BenchmarkPlus.PMT.UI.Controls"
    d:DataContext="{d:DesignInstance Type=UI:MainViewModel, IsDesignTimeCreatable=True}"
    Title="MainWindow" Height="1000" Width="1600" Background="#FF7A7C82">

    <Grid>
        <!-- Content Here -->
    </grid>

</Window>

回答:


263

mc:Ignorable="d"属性をWindowタグに追加する必要がありました。本質的に私は何か新しいことを学びました。d:Expression Blendの/ Visual Studioのデザイナーが認めていること、名前空間接頭辞を実際にされた/「コメントアウト」無視本当のコンパイラ/ XAMLパーサーによってを!

<Window 
...
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
...
/>

以下はから取られました

ネイサン、アダム(2010-06-04)。WPF 4 Unleashed(Kindle Locations 1799-1811)。サムズ。キンドル版。

マークアップの互換性

マークアップ互換性XML名前空間(http://schemas.openxmlformats.org/markup-compatibility/2006、通常はmcプレフィックスと共に使用)には、指定できない名前空間のすべての要素/属性を無視できないようにXAMLプロセッサに指示するIgnorable属性が含まれています.NETタイプ/メンバーに解決されます。(名前空間には、無視された名前空間内の特定のタイプのIgnorableをオーバーライドするProcessContent属性もあります。)

Expression Blendは、この機能を利用して、実行時に無視できるデザイン時プロパティをXAMLコンテンツに追加するなどのことを行います。

mc:Ignorableスペースで区切られた名前空間のリストを指定でき、mc:ProcessContentには要素でスペースで区切られたリストを指定できます。XamlXmlReaderは、解決できない無視できるコンテンツを検出すると、そのノードを報告しません。無視できるコンテンツが解決できる場合は、通常どおり報告されます。したがって、消費者はマークアップの互換性を正しく処理するために特別なことをする必要はありません。


12
私はかなり長い間、これに頭を悩ませてきました。理にかなっていますが、大きな見落としのようです(設計時のデータオブジェクトは、これらすべてのハックなしでサポートされる必要があります)
Basic

3
あなたの代わりに属性の使用など、自ノードにおける無視データコンテキストをしたい場合は、<D:Window.DataContext />
ChéDon

すばらしいヒントです。奇妙なコンパイラー例外を処理するのに役立ちました。mc:ignorableがないと、d:DataContextを設定しても、XAMLコンパイラはそれをDataContextを設定しようとしていると解釈し、間違ったxmlns名前空間の使用について不平を言いました。
Tore Aurstad

19

わあ、なんて痛みだ!MSがVS設計時のx:Bindのサポートを追加してくれることを期待しましょう。

VSデザイナーを使用できるようにするだけでなく、Bindingの代わりにx:Bindに簡単に切り替えることもできます。これが私がしたことです:

  • ビューに、ViewModelを取得するためのプロパティを追加しました。x:Bindパスはページ(つまり、ビューオブジェクト)を基準にしているため、これは理にかなっています。

  • ページXAML <Page ... >で、XAMLの上部に以下を追加しました。

    mc:Ignorable="d" 
    d:DataContext="{d:DesignInstance Type=local:MyView, IsDesignTimeCreatable=False}" 
    DataContext="{x:Bind}"

このようにして、ページの実際のデータコンテキストは、によってページ自体に設定され{x:Bind}ます。これx:Bindは、ページに対して相対的であり、パスが指定されていないためです。

同時に、 d:DataContext行のために、VSデザイナーは、VSデザイナーの相互作用の目的で、(インスタンスを作成せずに)MyViewクラスを反映します。これにより、VSをMyViewからデザインできるようになります。ここで、ViewModelプロパティまでスクロールして展開し、バインドするアイテムを選択できます。

これをすべて実行すると、VSデザイナーは、ビューへの相対パスであるBindingステートメントを作成します。つまり、x:Bindが予期するパスとまったく同じになります。したがって、後でx:Bindに切り替える場合は、すべての「{Binding」を検索して「」で置き換えることができます{x:Bind

d:DataContextVSにどのクラスを確認するかを伝えるための行が必要なのはなぜですか?次の行でDataContextをページに設定することをVSが理解できると思うので、良い質問です。DataContext={x:Bind}。自分自身を基準にしてx:BindをBindingに変更すると、機能せず、機能しません。

うまくいけば、この状況はMSによってクリーンアップされるでしょう!!


3
WPFはx:Bindをサポートしていません。この答えはOPでは機能しません。
Byrel Mitchell 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.