1. ホーム
  2. wpf

[解決済み】デザインタイムのDataContextをWindowに設定すると、コンパイラーエラーが発生する?

2022-04-08 17:38:28

質問

WPFアプリケーションのメインウィンドウに以下のXAMLを使用し、デザインタイムを設定しようとしています。 d:DataContext の下にある、様々なUserControlsではうまくいくのですが、ウィンドウでそれをしようとすると、このエラーが発生します。

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>

解決方法は?

を追加する必要がありました。 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"
...
/>

から取得したものです。

Nathan, Adam (2010-06-04). WPF 4 Unleashed (Kindle Locations 1799-1811). Sams. Kindle版.

マークアップ互換性

マークアップ互換性XML名前空間( http://schemas.openxmlformats.org/markup-compatibility/2006 通常 mc この属性は、指定された名前空間のすべての要素/属性が.NET型/メンバに解決できない場合、XAMLプロセッサに無視するように指示します。(名前空間は、無視された名前空間内の特定の型に対して Ignorable を上書きする ProcessContent 属性も持っています)。

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

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