2015-02-24 54 views
0

我目前正在开始使用XAML,并且对于如何定义元素的DataContext有一个疑问。WPF XAML:DataContext作为XAML元素的属性还是属性之间的区别?

我创建了一个观点,即包括与以下标记的页面:

<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属性而不是属性。但是,Visual Studio中的IntelliSense为我提供了一个DataContext属性,因此我想我只是在这里使用了一个错误的语法。你能指出这一点吗?

谢谢!

+0

我猜在这里,但第一个例子需要一个实例,其中作为第二个不似乎实例化一个。 – 2015-02-24 15:20:56

+0

我的代码在View中没有任何东西。通过调试,我发现(工作)示例调用ViewModel类的无参数公共构造函数。 – GeorgDangl 2015-02-24 15:25:18

+2

'DataContext =“ViewModel:MainViewModel”只将字符串“ViewModel:MainViewModel”分配给DataContext属性。它没有(也不应该)创建一个MainViewModel类的实例。请参阅MSDN上的[XAML语法详细信息](https://msdn.microsoft.com/en-us/library/ms788723.aspx)文章。 – Clemens 2015-02-24 15:29:16

回答

3

可以使用该属性来指定DataContext,但你应该考虑如何实现你的viewmodel。

这样

<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> 
+0

谢谢,这是一个很好的解释。如果我理解正确,在我使用的任何视图中,我将不得不实例化视图模型的对象,然后将其绑定到XAMLs子元素中? – GeorgDangl 2015-02-24 16:49:46

+1

@Rosenheimer,不是。您的视图模型可以先创建(例如,由另一个视图模型创建),然后WPF将创建一个视图并自动将视图模型附加到该视图(请参阅'DataTemplate')。您可以在后面的代码中创建视图模型(例如,在视图的构造函数中),并将其分配给视图的'DataContext'属性。您可以使用IoC容器将viewmodel注入到视图中。有很多方法可以创建视图模型并将其附加到视图的'DataContext'属性。我建议你阅读更多关于它的信息。 – dymanoid 2015-02-24 22:14:47

相关问题