从XAML获取DataContext

时间:2012-09-11 09:51:45

标签: c# wpf xaml datacontext

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

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

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

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

有关如何获取此DataContext的任何想法?

3 个答案:

答案 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,删除代码隐藏通常是一种很好的做法。