如何在MVVM模式中加载wpf usercontrol

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 DataTemplateUserControl(View)绑定到ViewModel:

<DataTemplate DataType="{x:Type vm:MyViewModel}">
    <v:MyUserControl />
</DataTemplate>

...

<ContentControl Content="{Binding Current}" />
Run Code Online (Sandbox Code Playgroud)

WPF将DataTemplate根据类型自动选择Content


She*_*dan 5

我知道这是一个陈旧的回答问题,但我有一个不同的方法.我喜欢在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屏幕的特定部分,或者只是填充屏幕的特定部分.您还可能拥有的多个实例KioskViewModelListBox,它会生成多个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)