我删除了MainWindow.xaml的CodeBehind,因为我正在做一个小项目,我确实必须这样做。
所以我通过xaml以这种方式创建了我的ViewModel实例:
<Grid.DataContext>
<lib:StartPageViewModel />
</Grid.DataContext>
现在,我需要在我的代码(StartPageViewModel)中使用DataContext
,因为我想打开另一个解决方案(有关更多信息,请查看here)。
有关如何获取此DataContext的任何想法?
答案 0 :(得分:1)
至少我解决了这个问题。 实际上我并不需要使用DataContext:
public static DTE2 GetDTE(DataContext dataContext)
{
ICustomTypeDescriptor typeDescriptor = dataContext as ICustomTypeDescriptor;
Debug.Assert(typeDescriptor != null, "Could not get ICustomTypeDescriptor from dataContext. Was the Start Page tool window DataContext overwritten?");
PropertyDescriptorCollection propertyCollection = typeDescriptor.GetProperties();
return propertyCollection.Find("DTE", false).GetValue(dataContext) as DTE2;
}
我将代码更改为以下内容,它现在完美运行,我可以在不使用DataContext的情况下打开解决方案:
public static DTE2 GetDTE()
{
return (DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE");
}
答案 1 :(得分:0)
ViewModel不应该对View有任何了解。
因此,在应用“正确的”MVVM时,您不应该尝试从ViewModel中获取DataContext。
放入DataContext的对象的StartPageViewModel
IS部分的代码。这意味着您可以在ViewModel的代码中使用this
来访问该对象。
如果您正在寻找网格(甚至更高的VisualTree),您可以使用Xaml中的属性传递它:
<Grid Name="MyGrid">
<Grid.DataContext>
<lib:StartPageViewModel MyParent={Binding ElementName=MyGrid} />
</Grid.DataContext>
</Grid>
但是,如果您这样做,则会将有关View的知识添加到ViewModel。
答案 2 :(得分:0)
我从未在XAML文件中声明过viewmodel,但您尝试过:
viewName.DataContext as ViewModelType;
BTW,删除代码隐藏通常是一种很好的做法。