c# - MVVM ViewModel与View交互,是真的MVVM吗?

标签 c# wpf design-patterns mvvm mvp

例如,我们有一个带有 2 个选项卡和一个文件菜单的 WPF 窗口。文件菜单有两个项目“隐藏选项卡1”、“显示选项卡1”

该程序具有以下类: MainView.xaml

MainViewModel.cs

“隐藏选项卡 1”菜单命令随后绑定(bind)到 MainViewModel.cs 中包含的 HideTab1Command

然后,HideTab1 直接与 View 交互,以在 ViewModel 中隐藏 tab1。

这在技术上不是 MVVM 行为(更像 MVP)吗?例如,对于真正的 MVVM,执行此行为的功能应完全包含在 XAML 代码中或 MainView.xaml.cs 内的“代码隐藏”中?

我经常看到 MVVM 应用程序和示例这样做,但它似乎违反了 SRP(单一职责原则)。

我看到其他一些应用程序使用 HideTab1 命令执行相同的操作,只是通过接口(interface) IMainView 通知 View ,然后调用 MainView.xaml.cs 中的代码

虽然我可以看到代码现在位于 View 中,但这与第一个示例有何不同?当 ViewModel 告诉 View 做什么时,SRP 仍然无效。

这些示例中的任何一个都是真正的 MVVM 模式吗?如果不是,实现隐藏/显示“选项卡 1”的正确 MVVM 模式是什么。

请原谅对 MVVM/MVP 的任何误解,我正在尽最大努力正确学习这些设计模式。

示例: ShowTab1 是一个直接操作 View 的命令。我一直在 MVVM 项目中看到这一点(很多 DevExpress 示例),但它似乎没有 MVVM 的任何好处,因为您的 ViewModel 直接操作您的 View 。

MainWindow.xaml

<Window x:Class="WpfApplication.MainWindow"
    ...
        <Button Content="Show hidden panels"   Command="{Binding ShowTab1}"/>
        ...
        <TabGroup>...
    ...
</Window>

MainWindowViewMode.cs

public class MainViewModel 
{
    IMainView mainView;
    public MainViewModel()
    {
        ShowTab1 = new ShowTab1Command(this);
        mainView = ... (set this to a reference to the view)
    }

    public ICommand ShowTab1 { get; set; }
}

public class ShowTab1Command: ICommand
{
    private readonly MainViewModel _model;
    public ShowTab1Command(MainViewModel model)
    {
        _model = model;            
    }
    void ICommand.Execute(object parameter)
    {
         _model.mainView.TabGroup1MakeVisible();
    }
    bool ICommand.CanExecute(object parameter)
    {
        return true;
    }

        public event EventHandler CanExecuteChanged;

   public interface IMainView{
       public void TabGroup1MakeVisible();

真正的 MVVM 将拥有一个纯粹用于将数据转换为 View 所需的 DataContext 的 ViewModel。所有 View 操作都将在 View 中完成,例如在 CodeBehind 或 XAML 中。或者这是不正确的?

最佳答案

HideTab1 then directly interacts with the View to hide tab1 from within the ViewModel.

这就是程序“破坏”MVVM 的地方。正确的解决方案是让命令更改 ViewModel 上的属性,例如:ShowTab1

在 View 中,您可以将 Visibility(使用值转换器)或 IsEnabled 绑定(bind)到此属性。

这样 ViewModel 就不会直接与 View 交互。

关于c# - MVVM ViewModel与View交互,是真的MVVM吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40625454/

相关文章:

c# - AsyncEx DeferralManager 用于等待事件处理程序

c# - 鼠标下带有缩略图的 CAD 插入 block

c# - WPF - 根据某些条件选择启动窗口

java - 省略了在 Java 子类中使用构造函数

c# - 如何通过t4生成自定义类?

c# - 从临时 ASP.NET 文件中清除冲突的类文件

c# - ListView 在更新时不会改变

wpf - 以编程方式绘制路径

javascript - 传递参数时如何避免模块模式中的 getter/setter 函数

c# - 发送带有附件 WinRT 的电子邮件