WPF XAML:DataContext作为XAML元素的属性或属性的区别?

时间:2015-02-24 15:15:52

标签: c# wpf xaml

我目前正在开始使用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属性,所以我想我在这里只是使用了错误的语法。你能指出这个吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

可以使用该属性指定DataContext,但您应该考虑如何实例化您的viewmodel。

以这种方式使用属性

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

告诉WPF实例化MainViewModel并将创建的对象分配给DataContext的{​​{1}}属性。

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

string

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

所以你可以使用例如DataContext="ViewModel:MainViewModel" Binding / StaticResource将已创建的实例分配给DynamicResource属性:

DataContext

DataContext="{Binding ViewModel}"