【发布时间】:2013-02-07 20:12:31
【问题描述】:
假设我有一个 WPF 应用程序 (exe),它在 MainWindow.xaml 中有这个:
<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 中的{Binding Something} 使用 MyMVVMUserControl 的 View Model 设置作为 DataContext(而不是 MainWindow.cs 中设置的 DataContext (设置为 MainWindowVM))。
我的问题是为什么?
为什么 WPF 会查看用户控件内部并将其 DataContext 用于实际应用程序中的绑定?
(注意:我知道我可以通过在绑定中设置源来解决这个问题,但我希望其他人能够使用我的用户控件。但是对于这个问题,我现在有一个内置的“陷阱”任何我想使用我的用户控件的人。)
【问题讨论】:
-
我强烈推荐 Snoop 检查正在运行的应用程序并查看每个元素的 DataContext 是什么。
-
另外,InitalizeComponent() 应该先行。
-
如果 InitalizeComponent 是第一个,那么任何需要 CataContext 的控件都不会拥有它...对吗?
-
@HighCore - 感谢 Snoop 的指针。我会看看它。但在这种情况下,我在绑定中添加了
PresentationTraceSources.TraceLevel=High。这清楚地告诉我 MainWindow.xaml 中绑定的 DataContext 正在使用用户控件的 DataContext。