2015-02-24 55 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

相關問題