【发布时间】:2011-02-09 08:37:24
【问题描述】:
我正在尝试让我的第一个 WPF 应用程序使用 MVVM 运行,但遇到了一些绑定问题。
设置是我有一个视图和 viewModel,其中包含用户详细信息(父级),为了保持简单,我将该视图的一部分放入单独的视图和 viewModel(子级)中。子视图被定义为 UserControl。
我遇到的问题是如何设置子视图(UserControl)的 DataContext。我的父 ViewModel 有一个公开子 ViewModel 的属性,如下所示:
class ParentViewModel: INotifyPropertyChanged
{
public ChildViewModel childViewModel { get; set; }
//...
}
在我的父视图的 XAML 中(它的 DataContext 设置为 ParentViewModel),我尝试如下设置子视图的 DataContext:
<views:ChildView
x:Name="ChildView"
DataContext="{Binding childViewModel}"/>
但是,这不起作用。子视图的 DataContext 设置为与父视图(即 ParentViewModel)相同的 DataContext,就好像我根本没有设置它一样。我还尝试在子视图本身中设置 DataContext,这也不起作用:
<UserControl x:Class="DietRecorder.Client.View.ChildView"
DataContext="childViewModel"
我找到了几种解决方法。在子视图中,我可以通过在路径中包含 ChildViewModel 来绑定所有内容:
<SomeControl Visibility="{Binding Path=childViewModel.IsVisible}">
但我不希望子视图具有这种层次结构的意识。在代码中设置 DataContext 也可以 - 但是,我必须在显示父视图后执行此操作,否则当我调用 Show() 时 DataContext 会被覆盖:
parentView.Show();
parentView.ChildView.DataContext = parentViewModel.childViewModel;
这段代码也让我感到不安,违反了LOD等等。
这似乎只是 DataContext 的问题 - 我可以在孩子中绑定其他东西,例如我尝试将 FontSize 绑定到一个 int 属性只是为了测试它:
<views:ChildView
x:Name="ChildView"
FontSize="{Binding Path=someVal}"/>
而且效果很好。
但我确信绑定 DataContext 应该可以工作 - 我见过类似的例子。我在这里错过了什么明显的东西吗?有没有理由这不起作用?某处有拼写错误吗? (为了您的利益,我重命名了一些东西,所以无论如何您都无法帮助我)。
欢迎任何想法。
编辑
再次查看此代码,我似乎在某处犯了错误,因为父视图中的以下 XAML 现在似乎可以工作:
<views:ChildView
x:Name="ChildView"
DataContext="{Binding childViewModel}"/>
我不知道为什么我最初不能让它工作,或者我可能做了什么改变才能让它工作。可能是答案之一所暗示的 INotifyPropertyChanged 问题。哦,好吧,向上和向上..
【问题讨论】: