WPF usercontrol mvvm

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF usercontrol mvvm相关的知识,希望对你有一定的参考价值。

我在使用usercontrols实现MVVM时遇到问题。

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

在其中一个视图(用户控件)中,左边是菜单,右边是内容。内容根据菜单而变化。我尝试使用usercontrol实现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>
答案

老实说,我认为你需要回顾一下并在继续之前阅读一本关于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。

以上是关于WPF usercontrol mvvm的主要内容,如果未能解决你的问题,请参考以下文章

关于在MVVM架构下WPF中UserControl的 visibility Binding问题。 UserControl MVVM

如何在 MVVM 中的 UserControl 之间进行通信 - WPF 应用程序

在 UserControl WPF MVVM caliburn 内的 UserControl 之间切换

WPF MVVM 通过事件将 UserControl 从一个 ObservableCollection 移动到另一个

使用 MVVM 在 MainWindow 上绑定 UserControl 视图模型

如何从作为wpf mvvm模式中的窗口打开的视图模型中关闭用户控件?