同我知道这是一个古老的,回答问题,但我有一个不同的方法。我喜欢在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