在C#中,如何在ViewModel中的视图上设置DataContext?

在C#中,如何在ViewModel中的视图上设置DataContext?,c#,wpf,mvvm,binding,datacontext,C#,Wpf,Mvvm,Binding,Datacontext,我试着围绕MVVM来思考。我了解很多,但我很难理解一个方面:设置DataContext 我想显示一个具有特定对象的视图。用户无法决定什么是可见的,因此我需要在代码中创建视图。然后,我想将视图的DataContext设置为一个对象(用于绑定)。我尝试不将此代码放在视图中,但view.LayoutRoot.DataContext不是公共的 我错过了什么 试图避免这种情况: public class View { public View(object dataContext) {

我试着围绕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;
    }
}

不要忘记视图应该知道ViewModel,而不是相反

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


Josh Smith的关于MVVM的文章对如何将视图应用到ViewModel有一个很好的解释。他建议使用WPF的DataTemplates来选择XAML中的视图。

如果使用XAML控件或窗口(如果使用MVVM,应该是这样),LayoutRoot(默认情况下为Grid)在您的示例中,您只使用一个普通类作为视图,因此很难判断发生了什么


另外,我赞同Cameron的观点-nor视图或ModelView应该处理分配DataContext的问题。这可以通过不同的方式完成(DataTemplate、依赖项注入、特殊构建器类、普通代码),但通常都发生在应用程序级别。

非常感谢您的帮助。这将我推向了正确的方向。