XAML中的WPF DataContext,为什么以及正确的方法是什么

时间:2020-03-05 03:45:54

标签: c# wpf xaml binding datacontext

当前,这是我为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即可获得绑定的智能感知的方法。因为如果我将其放在代码后面,我将不再获得智能感知,并且当我尝试绑定对象时,必须正确输入从引用我的视图模型开始的所有内容。

谢谢, 蒂姆

1 个答案:

答案 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,这也将无法正常工作。

相关问题