Rel*_*ity 6 wpf user-controls mvvm
我正在创建一个mvvm模式的wpf用户控件.所以我们有:view(代码隐藏文件中没有代码),viewmodel,model,dataaccess文件.
我有MainWindow .xaml作为视图文件,我需要与MainWindowModel .cs 绑定.
通常,在一个wpf应用程序中,我们可以使用App.xaml文件中的onStartUp事件来完成此操作.但是在用户控制方面,因为我们没有App.xaml ......我如何实现它?
请帮助:( ...提前致谢!!!
Tho*_*que 16
您可以使用a ContentControl,用a DataTemplate将UserControl(View)绑定到ViewModel:
<DataTemplate DataType="{x:Type vm:MyViewModel}">
<v:MyUserControl />
</DataTemplate>
...
<ContentControl Content="{Binding Current}" />
Run Code Online (Sandbox Code Playgroud)
WPF将DataTemplate根据类型自动选择Content
我知道这是一个陈旧的回答问题,但我有一个不同的方法.我喜欢在App.xaml文件中建立隐式关系:
<Application.Resources>
<DataTemplate DataType="{x:Type ViewModels:KioskViewModel}">
<Views:KioskView />
</DataTemplate>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)
有了这个,就不需要在任何地方设置DataContext.
更新>>>
回应@Vignesh Natraj的要求,这是一个更全面的解释:
一旦你已经建立了DataTemplate一个Resources元素,可以显示KioskView通过增加的实例在这个例子KioskViewModel中的XAML的任何地方.这可能是填充MainWindow屏幕的特定部分,或者只是填充屏幕的特定部分.您还可能拥有的多个实例KioskViewModel中ListBox,它会生成多个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>
Run Code Online (Sandbox Code Playgroud)
我更喜欢将MVVM设计模式与WPF一起使用,因此我将有一个基本视图模型类,提供有用的功能,例如实现基本INotifyPropertyChanged接口.然后我ViewModel在类型的主(顶级)视图模型中调用了一个属性BaseViewModel.这为我提供了一种很好的方法,可以将ViewModel属性更改为派生自的任何视图模型,BaseViewModel从而能够从视图模型中更改关联的视图.
例如,在MainViewModel.cs绑定的类中MainView有一个字段和相关属性:
private BaseViewModel viewModel = new KioskViewModel();
public BaseViewModel ViewModel
{
get { return viewModel; }
set { viewModel = value; NotifyPropertyChanged("ViewModel"); }
}
Run Code Online (Sandbox Code Playgroud)
如您所见,它作为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>
Run Code Online (Sandbox Code Playgroud)
请注意,在这个例子中,我们需要声明两个(或更多,以使这种方法很有用)DataTemplateS中的App.xaml文件:
<Application.Resources>
<DataTemplate DataType="{x:Type ViewModels:MainViewModel}">
<Views:MainView />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:KioskViewModel}">
<Views:KioskView />
</DataTemplate>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)