我通常在代码隐藏中实例化我的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方法,它是如何实现的?
我创建了这个小例子,以便找出是否有简单的答案。
答案 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
是正确的方法。