C# WPF XAML:DataContext作为XAML元素的属性或属性之间的差异?

C# WPF XAML:DataContext作为XAML元素的属性或属性之间的差异?,c#,wpf,xaml,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

我目前正在开始使用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元素似乎希望将数据源定义为XAML属性,而不是属性。然而,VisualStudio中的IntelliSense为页面提供了一个DataContext属性,所以我想我只是使用了一个错误的语法。你能告诉我吗


谢谢

> P> <强> > 使用属性指定<代码> DATACONTEXT/<代码>,但您应该考虑如何将VIEW模型实例化。

以这种方式使用属性

<Page.DataContext>
     <ViewModel:MainViewModel />
</Page.DataContext>
但是您希望WPF为您创建一个实例

因此,您可以使用例如
绑定
静态资源
/
动态资源
将创建的实例分配给
数据上下文
属性:

DataContext="{Binding ViewModel}"



< />代码>

< <强> > 使用属性指定<代码> DATACONTEXT/<代码>,但您应考虑如何将VIEW模型实例化。

以这种方式使用属性

<Page.DataContext>
     <ViewModel:MainViewModel />
</Page.DataContext>
但是您希望WPF为您创建一个实例

因此,您可以使用例如
绑定
静态资源
/
动态资源
将创建的实例分配给
数据上下文
属性:

DataContext="{Binding ViewModel}"



我在这里猜测,但第一个示例需要一个实例,而第二个示例似乎没有实例化一个实例。在视图中,我的代码中没有任何内容。通过调试,我发现(工作)示例调用了ViewModel类的无参数公共构造函数。
DataContext=“ViewModel:MainViewModel”
仅将字符串“ViewModel:MainViewModel”分配给DataContext属性。它不会(也不应该)创建MainViewModel类的实例。请参阅MSDN上的文章。我在这里猜测,但第一个示例需要一个实例,而第二个示例似乎没有实例化一个实例。我的代码中没有任何内容。通过调试,我发现(工作)示例调用了ViewModel类的无参数公共构造函数。
DataContext=“ViewModel:MainViewModel”
仅将字符串“ViewModel:MainViewModel”分配给DataContext属性。它不会(也不应该)创建MainViewModel类的实例。请参考MSDN上的文章。谢谢,这是一个很好的解释。如果我理解正确,在我使用的任何视图中,我都必须实例化视图模型的一个对象,然后在XAMLs子元素中绑定到它?@Rosenheimer,不是真的。可以先创建viewmodel(例如,由另一个viewmodel创建),然后WPF将为其创建一个视图,并自动将viewmodel附加到该视图(请参见
数据模板
)。您可以在代码隐藏中创建viewmodel(例如,在视图的构造函数中),并将其分配给视图的
DataContext
属性。可以使用IoC容器将viewmodel注入视图中。有很多方法可以创建viewmodel并将其附加到视图的
DataContext
属性。我建议你多读一些,谢谢,这是一个很好的解释。如果我理解正确,在我使用的任何视图中,我都必须实例化视图模型的一个对象,然后在XAMLs子元素中绑定到它?@Rosenheimer,不是真的。可以先创建viewmodel(例如,由另一个viewmodel创建),然后WPF将为其创建一个视图,并自动将viewmodel附加到该视图(请参见
数据模板
)。您可以在代码隐藏中创建viewmodel(例如,在视图的构造函数中),并将其分配给视图的
DataContext
属性。可以使用IoC容器将viewmodel注入视图中。有很多方法可以创建viewmodel并将其附加到视图的
DataContext
属性。我建议你多读一些。