同我知道這是一個古老的,回答問題,但我有一個不同的方法。我喜歡在App中建立隱式關係。xaml文件:
<Application.Resources>
<DataTemplate DataType="{x:Type ViewModels:KioskViewModel}">
<Views:KioskView />
</DataTemplate>
</Application.Resources>
由此,不需要在任何地方設置DataContext。
UPDATE >>>
針對@Vignesh Natraj的要求,這裏是一個更全面的解釋:
一旦你在Resources
元素建立DataTemplate
,你可以在這個例子中顯示KioskView
通過在您的XAML中的任何位置添加KioskViewModel
的實例。這可能是填充MainWindow
,或者只是在屏幕的特定部分。您還可以在ListBox
中託管KioskViewModel
的多個實例,並且它將生成多個KioskView
實例。
根據您的要求,您可以用幾種方法將KioskViewModel
的實例添加到XAML中。一種方法是爲包含KioskViewModel.cs
文件的項目聲明XML命名空間,並將其實例添加到ContentControl
中希望顯示視圖的頁面中。舉例來說,如果你有一個UserControl
稱爲MainView
和KioskViewModel.cs
文件是在一個Kiosk.ViewModels
命名空間,你可以使用基本的XAML這樣的:
<UserControl x:Class="Kiosk.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ViewModels="clr-namespace:Kiosk.ViewModels">
<UserControl.Resources>
<ViewModels:KioskViewModel x:Key="KioskViewModel" />
<DataTemplate DataType="{x:Type ViewModels:KioskViewModel}">
<Views:KioskView />
</DataTemplate>
</UserControl.Resources>
<ContentControl Content="{StaticResource KioskViewModel}" />
</UserControl>
我更喜歡使用與WPF的MVVM設計模式,所以我會提供有用功能的基本視圖模型類,例如實現基本的接口。然後我在BaseViewModel
類型的主(頂級)視圖模型中有一個名爲ViewModel
的屬性。這爲我提供了一種很好的方法,可以將ViewModel
屬性更改爲衍生自BaseViewModel
的任何視圖模型,因此可以從視圖模型中更改關聯的視圖。
例如,在綁定到MainView
的MainViewModel.cs
類有一個字段和相關屬性:
private BaseViewModel viewModel = new KioskViewModel();
public BaseViewModel ViewModel
{
get { return viewModel; }
set { viewModel = value; NotifyPropertyChanged("ViewModel"); }
}
正如你可以看到,它開始了作爲一個KioskViewModel
實例,但可以改變任何隨時響應用戶交互的其他視圖。對於這種設置中,XAML是非常相似的,但不是宣佈在Resources
元素視圖模型的實例,我們綁定到財產的MainViewModel
:
<UserControl x:Class="Kiosk.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ViewModels="clr-namespace:Kiosk.ViewModels">
<ContentControl Content="{Binding ViewModel}" />
</UserControl>
注意,在這個例子中,我們需要聲明兩個(或更多,以使這種方法很有用)DataTemplate
S IN的App.xaml
文件:
<Application.Resources>
<DataTemplate DataType="{x:Type ViewModels:MainViewModel}">
<Views:MainView />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:KioskViewModel}">
<Views:KioskView />
</DataTemplate>
</Application.Resources>
我們不需要任何屬性(依賴屬性或普通屬性)...在內容標籤中?或者「當前」如何滿足相同的內容? – Relativity 2010-05-20 12:47:58
嗨托馬斯,你能給我一個關於上述查詢的想法嗎? – Relativity 2010-05-21 06:15:56
在上面的代碼中,「Current」將是數據上下文的屬性,類型爲「MyViewModel」 – 2010-05-21 09:22:00