在XAML中设置时,在代码中访问DataContext实例

时间:2015-06-22 08:25:06

标签: c# wpf mvvm

我通常在代码隐藏中实例化我的ViewModel并将其设置为Window或UserControl的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 个答案:

答案 0 :(得分:8)

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

想象一下场景:

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

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

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

要掌握代码隐藏中的DataContext,您只需引用该元素的DataContext即可。

ViewModel vm = (ViewModel)this.DataContext;

上面的代码引用了DataContext的{​​{1}}。

如果您需要更具体,并获得特定元素的Window,那么您只需按名称引用该元素。

DataContext

除此之外,您应该从不在代码隐藏中设置ViewModel vm = (ViewModel)elementName.DataContext; 。 MVVM设计模式喜欢将事物分开,如果你开始设置DataContext的{​​{1}},那么事情就会很快搞砸。

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