在XAML中设置DataContext实例后如何在代码中访问它

7

我通常在代码中实例化我的ViewModel,并将其作为窗口或用户控件的DataContext进行设置。

对于这个简单的ViewModel:

public class ViewModel
{
    public ObservableCollection<string> items { get; set; }

    public ViewModel()
    {
        items = new ObservableCollection<string>();
        items.Add("FirstItem");
        items.Add("SecondItem");
        items.Add("ThirdItem");
    }
}

我正在添加我的本地命名空间,下面的语法将解决问题:
<Window.DataContext>
    <local:ViewModel/>
</Window.DataContext>

很好,我理解一个ViewModel对象被实例化并设置为窗口的DataContext,它按预期工作,但是否有任何方法可以从代码中访问已实例化的对象?
如果我在代码后台创建对象:
ViewModel vm = new VewModel();
this.DataContext = vm;

我能够访问VM实例,但是采用XAML方法,如何访问?

为了找到一个简单的答案,我创建了这个小例子。

1个回答

10

当您设置DataContext时,任何元素的所有子元素也将具有相同的DataContext

想象一下场景:

<Window.DataContext>
    <local:ViewModel/>
</Window.DataContext>

在这里,您已经为 Window 给出了一个 DataContext。现在,您窗口内的所有子元素实际上都具有相同的 DataContext

<TextBox Text="{Binding MyProperty}" />

在代码后台获取DataContext,您可以简单地引用元素的DataContext

ViewModel vm = (ViewModel)this.DataContext;

上面的代码引用了 WindowDataContext

如果需要更具体地获取 特定 元素的 DataContext,则可以通过名称直接引用该元素。

ViewModel vm = (ViewModel)elementName.DataContext;

抛开所有这些,你绝对不应该在代码后台设置DataContext。MVVM设计模式喜欢保持事物分离,如果你开始为一个UserControl设置DataContext,那么很快就会出现问题。

在XAML中设置DataContext才是正确的方法。


2
+1,但在XAML中设置DataContext并不总是正确的方法。例如,如果您的ViewModel是通过View的构造函数注入的,则在代码后台中设置它是正确的方法。 - almulo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接