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

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

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

MainViewModel.cs

然后将“隐藏选项卡1”菜单命令绑定到MainViewModel.cs中包含的HideTab1Command。

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

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

我经常看到MVVM应用程序和示例执行此操作,但是它似乎打破了SRP(单一责任原则)。

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

虽然我可以看到代码现在位于View中,但它与第一​​个示例有什么真正的不同? SRP仍然无效,因为ViewModel告诉View怎么做。

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

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

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

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将具有一个ViewModel,纯粹用于将数据转换为视图期望的DataContext。所有视图操作都将在View中完成,例如在CodeBehind或XAML中。还是不正确?

参考方案

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

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

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

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

WPF-将窗口大小设置为子用户控件大小 - c#

我有一个选项卡控件,该控件动态地填充有包含各种大小的用户控件的选项卡。打开选项卡后,我希望窗口自动调整大小,使其在活动用户控件下有意义。有一种干净的方法可以做到这一点吗?我正在使用标准的mvvm模式。 参考方案 在Window类上使用SizeToContent属性。<Window x:Class="WpfApplication1.MainWi…

WPF MVVM-简单登录到应用程序 - c#

我将继续学习WPF,目前主要关注MVVM,并使用Karl Shifflett的“盒子中的MVVM”教程。但是有一个关于在视图/视图模型之间共享数据以及如何更新屏幕上的视图的问题。 ps。我还没有介绍IOC。下面是我在测试应用程序中的MainWindow的屏幕截图。它分为3个部分(视图),一个标题,一个带按钮的滑动面板,其余作为应用程序的主视图。该应用程序的目…

MVVM对javascript库的依赖性? - javascript

我熟悉MVC,但不熟悉MVVM。我检查了与MVC / MVVM / MVP之间的差异有关的各种帖子。甚至我检查了Microsoft的Office链接https://msdn.microsoft.com/en-us/magazine/dn463786.aspx,但每次在这些链接中发现一个共同点是,它们使用第三方JavaScript库(Angular,knock…

将观察者集合分配给列表框时出错 - c#

我有列表框,我想向其中添加项目,当我尝试以下代码时,出现错误你调用的对象是空的。”错误是当我执行item source = _userList时,我在这里做错了什么?public ObservableCollection<User> _UsersList = new ObservableCollection<User>(); publ…

用户清除WPF中的文本字段时,文本框未将值设置为null - c#

我有下一个文本框:<TextBox FontSize="10"> <TextBox.Text> <Binding Path="EstatusAdministrativo" ValidatesOnDataErrors="True" UpdateSourceTrigger=…