【问题标题】:WPF XAML: Difference between DataContext as attribute or property for XAML element?WPF XAML:DataContext 作为 XAML 元素的属性或属性之间的区别?
【发布时间】:2015-04-26 07:00:59
【问题描述】:

我目前正在开始使用 XAML,我有一个关于如何定义元素的 DataContext 的问题。

我创建了一个包含具有以下标记的页面的视图:

<Page x:Class="View.MainView"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:ViewModel="clr-namespace:ViewModel"
  mc:Ignorable="d"
  Title="MainView">
  ...
  </Page>

当我想给这个页面一个 DataContext 以供子元素使用时,这是可行的:

<Page x:Class="View.MainView"
  ...
  mc:Ignorable="d"
  Title="MainView">
  <Page.DataContext>
    <ViewModel:MainViewModel />
  </Page.DataContext>
  ...
  </Page>

这不是:

<Page x:Class="View.MainView"
  ...
  mc:Ignorable="d"
  Title="MainView" DataContext="ViewModel:MainViewModel">
  ...
  </Page>

对我来说,Page 元素似乎希望将 DataSource 定义为 XAML 属性,而不是属性。但是,Visual Studio 中的 IntelliSense 为我提供了页面的 DataContext 属性,所以我想我只是在这里使用了错误的语法。你能指出来吗?

谢谢!

【问题讨论】:

  • 我在这里猜测,但第一个示例需要一个实例,而第二个似乎没有实例化一个。
  • View 后面的代码中没有任何内容。通过调试,我发现(工作的)示例调用了我的 ViewModel 类的无参数公共构造函数。
  • DataContext="ViewModel:MainViewModel" 仅将字符串“ViewModel:MainViewModel”分配给 DataContext 属性。它不会(也不应该)创建 MainViewModel 类的实例。请参考 MSDN 上的XAML Syntax In Detail 文章。

标签: c# wpf xaml


【解决方案1】:

可以使用该属性来指定DataContext,但您应该考虑如何实例化您的视图模型。

以这种方式使用属性

<Page.DataContext>
     <ViewModel:MainViewModel />
</Page.DataContext>

您告诉 WPF 实例化 MainViewModel 并将创建的对象分配给 PageDataContext 属性。

使用属性,在这种情况下,您只需指定 string

DataContext="ViewModel:MainViewModel"

但是您希望 WPF 为您创建一个实例。

所以你可以使用例如BindingStaticResource / DynamicResource 将创建的实例分配给 DataContext 属性:

DataContext="{Binding ViewModel}"

<Page DataContext="{StaticResource ViewModel}">
    <Page.Resources>
        <ViewModel:MainViewModel x:Key = "ViewModel"/>
    </Page.Resources>
</Page>

【讨论】:

  • 谢谢,这是一个很好的解释。如果我理解正确,在我使用的任何视图中,我都必须实例化我的视图模型的一个对象,然后在 XAML 子元素中绑定到它?
  • @Rosenheimer,不是真的。您的视图模型可以首先创建(例如,由另一个视图模型),然后 WPF 将为它创建一个视图并自动将视图模型附加到该视图(请参阅DataTemplate)。您可以在代码后面(例如,在视图的构造函数中)创建视图模型,并将其分配给视图的 DataContext 属性。您可以使用 IoC 容器在视图中注入您的视图模型。有很多方法可以创建视图模型并将其附加到视图的 DataContext 属性。我建议您阅读更多相关信息。
猜你喜欢
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
相关资源
最近更新 更多