繁体   English   中英

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

[英]Access DataContext instance in code when set in XAML

我通常在代码隐藏中实例化我的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方法,它是如何实现的?

我创建了这个小例子,以便找出是否有简单的答案。

当您设置任何元素的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设计模式喜欢将事物分开,如果你开始设置UserControlDataContext ,那么事情就会很快搞砸。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM