Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在XAML中设置时访问代码中的DataContext实例_C#_Wpf_Mvvm - Fatal编程技术网

C# 在XAML中设置时访问代码中的DataContext实例

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>();

我通常在codebehind中实例化ViewModel,并将其设置为窗口或用户控件的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");
    }
}
我能够访问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;