【问题标题】:In C#, how can I set DataContext on a View from the ViewModel?在 C# 中,如何在 ViewModel 的视图上设置 DataContext?
【发布时间】:2010-11-05 20:57:49
【问题描述】:

我正在尝试围绕 MVVM 展开。我了解很多,但我很难掌握一个方面:设置 DataContext

我想展示一个包含特定对象的视图。用户无法决定什么是可见的,所以我需要在代码中创建视图。然后,我想将视图的 DataContext 设置为一个对象(用于绑定)。我试图不在视图中为此添加代码,但 View.LayoutRoot.DataContext 不是公开的。

我错过了什么?

尽量避免这种情况:

public class View
{
    public View(object dataContext)
    {
        InitializeComponent();
        LayoutRoot.DataContext = dataContext;  
    }
}

类似这样的:

public class ViewModel
{
    ...

    public UIElement GetView()
    {
        UIElement *element = new View();
        element.LayoutRoot.DataContext = element;
        return element;
    }
}

【问题讨论】:

    标签: c# wpf mvvm binding datacontext


    【解决方案1】:

    如果您使用 XAML 控件或窗口(如果您使用 MVVM,则应该是这种情况),LayoutRoot(默认为网格)是公共的。在您的示例中,您只为 View 使用了一个普通类,因此很难判断发生了什么。

    另外,我同意 Cameron 的意见 - View 或 ModelView 也不应该处理分配 DataContext。它可以通过不同的方式完成(DataTemplate、依赖注入、特殊构建器类、纯代码),但通常发生在应用程序级别。

    【讨论】:

      【解决方案2】:

      不要忘记 View 应该知道 ViewModel,而不是相反。

      因此,在您的情况下,将代码放入 ViewModel 以创建视图并不是最好的方法。

      Josh Smith 在 MVVM 上的 article 有一个 section 用于将 View 应用于 ViewModel。他建议使用 WPF 的 DataTemplates 在 XAML 中选择您的视图。

      【讨论】:

      • 非常感谢您的帮助。它把我推向了正确的方向。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 2011-06-03
      • 2015-08-21
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多