C# 从XAML获取数据上下文

C# 从XAML获取数据上下文,c#,wpf,xaml,datacontext,C#,Wpf,Xaml,Datacontext,我删除了MainWindow.xaml的代码隐藏,因为我正在做一个小项目,我必须这样做 因此,我正在通过xaml以这种方式创建ViewModel的实例: <Grid.DataContext> <lib:StartPageViewModel /> </Grid.DataContext> 现在,我需要在我的代码(StartPageViewModel)中使用这个DataContext,因为我想打开另一个解决方案(有关更多信息,请查看) 关于如何获取此数

我删除了MainWindow.xaml的代码隐藏,因为我正在做一个小项目,我必须这样做

因此,我正在通过xaml以这种方式创建ViewModel的实例:

<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项目。。