在C#中,如何在ViewModel中的视图上设置DataContext?
我试着围绕MVVM来思考。我了解很多,但我很难理解一个方面:设置DataContext 我想显示一个具有特定对象的视图。用户无法决定什么是可见的,因此我需要在代码中创建视图。然后,我想将视图的DataContext设置为一个对象(用于绑定)。我尝试不将此代码放在视图中,但view.LayoutRoot.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) {
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、依赖项注入、特殊构建器类、普通代码),但通常都发生在应用程序级别。非常感谢您的帮助。这将我推向了正确的方向。