0

我删除了 MainWindow.xaml 的 CodeBehind,因为我正在做一个小项目,我确实必须这样做。

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

<Grid.DataContext>
    <lib:StartPageViewModel />
</Grid.DataContext>

现在,我DataContext在我的代码(StartPageViewModel)中需要这个,因为我想打开另一个解决方案(更多信息请看这里)。

关于如何获得此 DataContext 的任何想法?

4

3 回答 3

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");
    }
于 2012-09-11T14:59:36.753 回答
0

ViewModel 不应该对 View 有任何了解。

因此,当应用“正确”的 MVVM 时,您不应该尝试从 ViewModel 中访问 DataContext。

StartPageViewModel放入 DataContext 的对象的 IS 部分的代码。这意味着您可以通过this在 ViewModel 的代码中使用来访问该对象。

如果您正在寻找 Grid(甚至更高的 VisualTree),您可以使用 Xaml 中的属性传递它:

<Grid Name="MyGrid">
    <Grid.DataContext>
        <lib:StartPageViewModel MyParent={Binding ElementName=MyGrid} />
    </Grid.DataContext>
</Grid>

尽管如此,如果您这样做,您就是在向 ViewModel 添加有关视图的知识。

于 2012-09-11T10:00:45.803 回答
0

我从未在 XAML 文件中声明过视图模型,但您是否尝试过:

viewName.DataContext as ViewModelType;

顺便说一句,删除代码隐藏通常是一个好习惯。

于 2012-09-11T10:04:33.057 回答