【问题标题】:Get DataContext From XAML从 XAML 获取 DataContext
【发布时间】:2012-09-11 22:59:36
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您可以在 xaml 中使用值 lib:StartPageViewModel 单独定义一个静态资源,然后您可以在网格中绑定相同的资源并在视图模型中使用新属性,以便两者都具有相同的对象。跨度>

标签: c# wpf xaml datacontext


【解决方案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");
    }

【讨论】:

    【解决方案2】:

    ViewModel 不应该知道关于 View 的任何信息。

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

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

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

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

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

    【讨论】:

    • thisStartPageViewModel,你能告诉我如何使用this 访问DataContext 吗?因为我现在只能访问属性..
    • 你想用 DataContext 做什么?
    【解决方案3】:

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

    viewName.DataContext as ViewModelType;
    

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

    【讨论】:

    • 视图在另一个项目中,所以我无权访问视图名称,因为这意味着我有循环依赖项。 ViewModel 在我的另一个项目中,不能引用 XAML 项目..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2015-11-17
    • 2010-10-30
    • 2014-03-09
    • 2015-04-04
    • 2012-10-14
    相关资源
    最近更新 更多