当前,这是我为Windows和UserConrols在MVVM中设置DataContext的方式
<UserControl.DataContext>
<local:DataMainViewModel x:Name="vm"/>
</UserControl.DataContext>
但是,我被告知永远不要这样做,但是我看到很多示例都在这样做。之前我确实遇到过一些奇怪的问题,例如DataContext在我看来不确定具有相同的实例。
无论如何,我只想问一问,最好的方法是什么?我可以在XAML中保持这种方法吗? 我听说我应该将其删除,而应在诸如...的视图中进行设置。
public DataMainView()
{
InitializeComponent();
DataContext = new DataMainViewModel();
}
哪种方法是最好,最安全的方法?
我之所以继续在XAML中进行设置,是因为我喜欢XAML的设计方法,使代码更整洁,最重要的是,我获得了绑定的智能感知。如果我应该在XAML中将其删除,请分享无需在XAML中设置DataContext即可获得绑定的智能感知的方法。因为如果我将其放在代码后面,我将不再获得智能感知,并且当我尝试绑定对象时,必须正确输入从引用我的视图模型开始的所有内容。
谢谢, 蒂姆
答案 0 :(得分:1)
无论是在XAML中还是在后面的代码中,您都不应明确设置UserControls的DataContext。
UserControl应该从其父元素继承其DataContext属性的值,并将其属性绑定到继承的DataContext中对象的属性。
通常看起来像
<Window ...>
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
...
<local:MyUserControl MyProperty="{Binding VmProperty}" .../>
</Window>
其中VmProperty是MainViewModel的属性。如果主视图模型为子视图模型提供了要由UserControl显示的属性,则绑定可能看起来像
<local:MyUserControl MyProperty="{Binding SubViewModel.SubVmProperty}" .../>
当UserControl明确设置其自己的DataContext时,这些绑定将不起作用。
或者,UserControl的XAML中的元素也可以直接绑定到DataContext对象的属性,例如
<UserControl x:Class="MyNamespace.MyUserControl" ...>
...
<TextBlock Text="{Binding SubVmProperty}"/>
...
</UserControl>
您将在其中实例化控件的地方
<local:MyUserControl DataContext="{Binding SubViewModel}"/>
如果UserControl设置了自己的DataContext,则上述绑定也会失败。
UserControl通常被DataTemplate之类的设置为
<DataTemplate DataType="{x:Type local:SubViewModel}">
<local:MyUserControl/>
</DataTemplate>
其中DataContext自动分配了要应用DataTemplate的对象。如果UserControl明确设置了自己的DataContext,这也将无法正常工作。