MainWindow.xaml にこれを含む WPF アプリケーション (exe) があるとします。
<Grid>
<extraControls:MyMVVMUserControl MyDependencyProperty="{Binding Something}"/>
<extraControls:MyUserControl MyDependencyProperty="{Binding Something}" />
</Grid>
私の MainWindow.xaml.cs は次のようになります。
public MainWindow()
{
DataContext = new MainWindowVM();
InitializeComponent();
}
そして、私の MainWindowVM.cs には、プロパティSomething
が変更されたことを通知するためのプロパティ設定があります。
ユーザー コントロールは、別の dll で作成されます。ご想像のとおりMyMVVMUserControl
、DataContext がビュー モデルに設定されています。
public MyMVVMUserControl()
{
DataContext = new MyMVVMUserControlVM();
InitializeComponent();
}
MyUserControl
コード ビハインドに DataContext が設定されていません。
興味深いことに、両者MyDependencyProperty
のセットアップはまったく同じです。
ただし、MVVM バージョンは機能しません。
少し掘り下げた後、MainWindow.xaml では、(MainWindow.cs に設定された (MainWindowVM に設定された) DataContext ではなく) DataContext として MyMVVMUserControl のビュー モデル設定が使用さ{Binding Something}
れていることがわかりました。
そして私の質問はなぜですか?
WPF がユーザー コントロールの内部を調べて、実際のアプリケーションにあるバインドにその DataContext を使用するのはなぜですか?
(注:バインディングにソースを設定することでこれを回避できることはわかっていますが、他のユーザーが私のユーザーコントロールを使用できるようにしたいと考えています。しかし、この問題により、必要な人のために組み込みの「落とし穴」ができましたユーザーコントロールを使用するために。)