WPF用户控件mvvm

时间:2019-03-17 11:04:20

标签: c# wpf mvvm

我在使用用户控件实现MVVM时遇到问题。

我有一个基于MVVM的应用程序。

在其中一个视图(它是一个用户控件)中,我在左侧有一个菜单,在右侧有内容。内容根据菜单而变化。 我试图通过用户控件来实现MVVM,但是我不知道如何。

这是我尝试过的方法,但是没有用:

<UserControl x:Class="PoS.Views.OptionsView"
    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:local="clr-namespace:PoS.Views"
    mc:Ignorable="d" 
    d:DesignHeight="450" d:DesignWidth="800">

    <UserControl.Resources>
        <DataTemplate x:Name="SettingsTemplate" DataType="{x:Type viewmodels:SettingsViewModel}">
            <views:SettingsView DataContext="{Binding}" />
        </DataTemplate>
    </UserControl.Resources>
    <Grid>

    </Grid>
</UserControl>

1 个答案:

答案 0 :(得分:0)

说实话,我认为您需要先倒带一下并阅读有关MVVM的好书,然后再继续。 Gary McLean Hall的Pro WPF and Silverlight MVVM是一个很好的起点。

为回答您的问题,我假设此用户控件的DataContext指向您的MainViewModel。右侧的内容需要在主视图模型中具有相应的属性,例如:

private ViewModelBase _CurrentPage;
public ViewModelBase CurrentPage
{
    get { return this._CurrentPage; }
    set
    {
        if (this._CurrentPage != value)
        {
            this._CurrentPage = value;
            RaisePropertyChanged(() => this.CurrentPage);
        }
    }
}

然后,您创建一堆“页面”或继承ViewModelBase的东西,即Page1ViewModelPage2ViewModelSettingsViewModel等。然后创建一个ContentControl并将其内容绑定到该属性:

<ContentControl Content="{Binding CurrentPage}" />

因此,现在,如果您的视图模型执行的操作类似于CurrentPage = new SettingsViewModel(),则ContentControl将使用您声明为该类型的DataTemplate的内容(即类型为views:SettingsView的控件)填充。如果将属性分配给其他内容,则SettingsView将被销毁,并由新类型的DataTemplate替换。

在上面的示例中,只有SettingsViewModel / SettingsView可以使用,因为这就是您创建的DataTemplate的全部;为了使其正常工作,您需要为所创建的每个ViewModel / View对类型创建一个单独的DataTemplate。