C# 在XAML中设置时访问代码中的DataContext实例
我通常在codebehind中实例化ViewModel,并将其设置为窗口或用户控件的DataContext 对于此简单的ViewModel:C# 在XAML中设置时访问代码中的DataContext实例,c#,wpf,mvvm,C#,Wpf,Mvvm,我通常在codebehind中实例化ViewModel,并将其设置为窗口或用户控件的DataContext 对于此简单的ViewModel: public class ViewModel { public ObservableCollection<string> items { get; set; } public ViewModel() { items = new ObservableCollection<string>();
public class ViewModel
{
public ObservableCollection<string> items { get; set; }
public ViewModel()
{
items = new ObservableCollection<string>();
items.Add("FirstItem");
items.Add("SecondItem");
items.Add("ThirdItem");
}
}
我能够访问vm实例,但使用XAML方法,如何访问它
我创建了这个小例子,以找出是否有一个简单的答案 设置任何元素的
DataContext
时,所述元素的所有子元素也将具有相同的DataContext
<TextBox Text="{Binding MyProperty}" />
想象一下这个场景:
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
要获得代码隐藏中的DataContext
,只需引用元素的DataContext
ViewModel vm = (ViewModel)this.DataContext;
上面的代码引用了窗口的DataContext
如果您需要更具体,并获取特定的元素的DataContext
,那么您可以简单地按名称引用该元素
ViewModel vm = (ViewModel)elementName.DataContext;
除此之外,您不应该在代码隐藏中设置DataContext
。MVVM设计模式喜欢将事情分开,例如,如果您开始设置UserControl
的DataContext
,那么事情很快就会搞砸
在XAML中设置DataContext
是正确的方法。+1但在XAML中设置DataContext
并不总是正确的方法。例如,如果视图模型是通过视图的构造函数注入的,那么在代码隐藏中设置它是正确的方法。
ViewModel vm = (ViewModel)this.DataContext;
ViewModel vm = (ViewModel)elementName.DataContext;