【问题标题】:Access DataContext instance in code when set in XAML在 XAML 中设置时在代码中访问 DataContext 实例
【发布时间】:2015-06-22 08:25:06
【问题描述】:

我通常在代码隐藏中实例化我的 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 方法,如何访问它?

我创建了这个小示例,以了解是否有可用的简单答案。

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    当您设置 any 元素的DataContext 时,该元素的所有子元素也将具有相同的DataContext

    描绘场景:

    <Window.DataContext>
        <local:ViewModel/>
    </Window.DataContext>
    

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

    <TextBox Text="{Binding MyProperty}" />
    

    要在代码隐藏中获取DataContext,您可以简单地引用元素的DataContext

    ViewModel vm = (ViewModel)this.DataContext;
    

    上面的代码引用了WindowDataContext

    如果您需要更具体,并获取特定元素的DataContext,那么您可以简单地按名称引用该元素。

    ViewModel vm = (ViewModel)elementName.DataContext;
    

    除此之外,您应该永远在代码隐藏中设置DataContext。 MVVM 设计模式喜欢将事物分开,例如,如果您开始设置 DataContextUserControl,那么事情很快就会搞砸。

    在 XAML 中设置 DataContext 是正确的方法。

    【讨论】:

    • +1,但在 XAML 中设置 DataContext 并不总是正确的方法。例如,如果您的 ViewModel 是通过 View 的构造函数注入的,那么在代码隐藏中设置它是正确的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2014-07-06
    • 2010-10-26
    • 1970-01-01
    • 2010-12-04
    相关资源
    最近更新 更多