[英]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;
上面的代码引用了Window
的DataContext
。
如果您需要更具体,并获取特定元素的DataContext
,那么您可以简单地按名称引用元素。
ViewModel vm = (ViewModel)elementName.DataContext;
所有这一切不谈,你永远不应该设置DataContext
代码隐藏。 MVVM设计模式喜欢将事物分开,如果你开始设置UserControl
的DataContext
,那么事情就会很快搞砸。
在XAML中设置DataContext
是正确的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.