【问题标题】:WPF usercontrol mvvmWPF 用户控件 mvvm
【发布时间】:2019-03-17 21:53:49
【问题描述】:

我在使用用户控件实现 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>

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    老实说,我认为您需要先倒带一点,然后再继续阅读一本关于 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。

    【讨论】:

    • 我对您推荐的书“Pro WPF 和 Silverlight MVVM”很感兴趣,但它在亚马逊上的评论并不好。如果你不介意,我想知道你为什么认为这是一本好书。
    • 诚实吗?因为这是我最初从中学到的,当时我发现它很有指导意义。当然,这是大约 7 或 8 年前的事了,“Silverlight”就在它的标题中,所以现在可能有很多更好的选择。我还发现 Josh Smith 的“高级 MVVM”值得一读,其中包含一些很好的实用技巧,虽然有点短。
    猜你喜欢
    • 2011-03-21
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 2011-04-07
    • 2010-12-15
    相关资源
    最近更新 更多