C# 从XAML获取数据上下文
我删除了MainWindow.xaml的代码隐藏,因为我正在做一个小项目,我必须这样做 因此,我正在通过xaml以这种方式创建ViewModel的实例:C# 从XAML获取数据上下文,c#,wpf,xaml,datacontext,C#,Wpf,Xaml,Datacontext,我删除了MainWindow.xaml的代码隐藏,因为我正在做一个小项目,我必须这样做 因此,我正在通过xaml以这种方式创建ViewModel的实例: <Grid.DataContext> <lib:StartPageViewModel /> </Grid.DataContext> 现在,我需要在我的代码(StartPageViewModel)中使用这个DataContext,因为我想打开另一个解决方案(有关更多信息,请查看) 关于如何获取此数
<Grid.DataContext>
<lib:StartPageViewModel />
</Grid.DataContext>
现在,我需要在我的代码(StartPageViewModel)中使用这个DataContext
,因为我想打开另一个解决方案(有关更多信息,请查看)
关于如何获取此数据上下文,您有什么想法吗?视图模型不应该知道任何有关视图的信息 因此,在应用“适当的”MVVM时,您不应该试图从ViewModel中获取DataContext
StartPageViewModel
的代码是放置在DataContext中的对象的一部分。这意味着您可以通过在ViewModel的代码中使用This
来访问对象
如果您正在查找网格(甚至更高的VisualTree),可以使用Xaml中的属性传递它:
<Grid Name="MyGrid">
<Grid.DataContext>
<lib:StartPageViewModel MyParent={Binding ElementName=MyGrid} />
</Grid.DataContext>
</Grid>
但是,如果这样做,您将向ViewModel添加有关视图的知识。我从未在XAML文件中声明过ViewModel,但您是否尝试过:
viewName.DataContext as ViewModelType;
顺便说一句,删除隐藏的代码通常是一种很好的做法。至少我解决了这个问题。 实际上,我并不需要使用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");
}
您可以使用xaml中的value lib:StartPageViewModel单独定义一个静态资源,然后可以在网格中绑定相同的资源,并在视图模型中绑定新的属性,以便两者都具有相同的对象。
这是StartPageViewModel
,您能告诉我如何使用这访问DataContext吗?因为我现在只能访问属性..您想对DataContext做什么?视图位于其他项目中,因此我无法访问Viewname,因为这意味着我有循环依赖关系。ViewModel在我的另一个项目中,不能引用XAML项目。。