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

Ola*_*cea 8 c# wpf mvvm

我通常在代码隐藏中实例化我的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");
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在添加我的本地命名空间,以下语法将设置正确的事情:

<Window.DataContext>
    <local:ViewModel/>
</Window.DataContext>
Run Code Online (Sandbox Code Playgroud)

很好,我知道ViewModel对象被实例化并设置为窗口的DataContext,它按预期工作但有没有办法从代码中访问实例化的对象?

如果我在代码隐藏中创建对象

ViewModel vm = new VewModel();
this.DataContext = vm;
Run Code Online (Sandbox Code Playgroud)

我能够访问vm实例但是使用XAML方法,它是如何实现的?

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

Mik*_*son 8

当您设置DataContext的任何元素,那么所有所述元件的孩子也会有相同的DataContext.

想象一下场景:

<Window.DataContext>
    <local:ViewModel/>
</Window.DataContext>
Run Code Online (Sandbox Code Playgroud)

在这里你给了Window一个DataContext.现在,窗口中的所有子元素实际上都具有相同的元素DataContext.

<TextBox Text="{Binding MyProperty}" />
Run Code Online (Sandbox Code Playgroud)

要掌握DataContext代码隐藏,您可以简单地引用DataContext元素.

ViewModel vm = (ViewModel)this.DataContext;
Run Code Online (Sandbox Code Playgroud)

上面的代码引用DataContext了Window.

如果您需要更具体,并得到DataContext一个的特定元素,那么你可以通过名字引用的元素.

ViewModel vm = (ViewModel)elementName.DataContext;
Run Code Online (Sandbox Code Playgroud)

除此之外,你永远不应该设置DataContext代码隐藏.该MVVM设计模式喜欢把事情分开,如果你开始设置DataContext的UserControl,例如,这种事情会很快搞砸了.

设置DataContextXAML是正确的方法.

  • +1,但在 XAML 中设置 `DataContext` 并不总是正确的方法。例如,如果您的 ViewModel 是通过 View 的构造函数注入的,那么在代码隐藏中设置它是正确的方法。 (2认同)