【问题标题】:Bad MVVM practice? (CommandParameter)不好的 MVVM 实践? (命令参数)
【发布时间】:2014-08-17 22:47:27
【问题描述】:

在我的代码中,我有 3 个按钮。他们每个人都执行不同的事情。我让它们使用相同的命令执行,但我给了它们不同的 CommandParameter 来指定差异。

这是我所说的一个例子

XAML:

            <Button Command="{Binding UpdateCommand}" CommandParameter="Add">Add Client</Button> 
            <Button Command="{Binding UpdateCommand}" CommandParameter="Change">Change Client</Button>
            <Button Command="{Binding UpdateCommand}" CommandParameter="Remove">Remove Client</Button>

视图模型:

        public MainWindowViewModel()
        {
            clients.Add(new Client() { Name = "Client 1" });
            clients.Add(new Client() { Name = "Client 2" });

            //UpdateCommand = new ClientUpdateCommand(this);
            UpdateCommand = new DelegateCommand(param => ClientExecuteCommand((string)param), param => ClientCanExecuteCommand((string)param));
        }

        public void ClientExecuteCommand(string param)
        {
            ClientDialog cd;
            switch(param)
            {
                case "Add":
                    cd = new ClientDialog("Add Client", "Add Client", "Random User");
                    cd.ShowDialog();
                    clients.Add(new Client() { Name = cd.nameTxtBox.Text });
                    break;
                case "Change":
                    cd = new ClientDialog("Change Client", "Change Client", SelectedClient.Name);
                    cd.ShowDialog();
                    SelectedClient.Name = cd.nameTxtBox.Text;
                    break; 
                case "Remove":
                    clients.Remove(SelectedClient);
                    break;
            }
        }

        public bool ClientCanExecuteCommand(string param)
        {
            if (param == "Add")
                return true;
            else
                return !(SelectedClient == null);
        }

我只是想知道这是否是不好的编程习惯,或者我是否应该为每个按钮创建不同的命令?如果这没问题;我什么时候应该创建 CommandParameter?

提前感谢您的回答:)

【问题讨论】:

  • 真的,您应该考虑围绕它的意义来设计您的命令,而不是根据需要它。在这种情况下,您有一个 Add、Change 和 Remove 标记,它们都会影响 SelectedClient。由于您以不同的方式影响相同的上下文,我会说这是完全可以接受的。
  • @Xcalibur37 这就是我的想法。感谢您的反馈:)

标签: c# wpf mvvm parameters command


【解决方案1】:

这充其量是值得怀疑的做法。问问自己:如果您要创建方法而不是命令,您会将它们命名为“更新”并将要更新的内容作为“字符串参数”传递,还是更愿意使用具有有意义名称的单独方法?

您的公共界面变得不那么清晰(您需要记录作为“参数”传递的内容),您使您的设计更加脆弱(错字不会导致任何错误或警告),您引入了魔术常量。总的来说,你让你的代码变得更糟。但要短一点,如果这是你所追求的。

如果您想避免为每个操作创建命令(这可能会变得冗长并因此很烦人),您可以使用 MVVM 库,它不会强迫您这样做。例如,使用 Caliburn.Micro,您可以只使用三个方法和三个按钮,而无需弄乱命令和参数。

【讨论】:

  • @CodingMadeEasy 这很好。如果方法的数量成为问题,您可以将您的类分成几个类(可能使用聚合)。例如,您可以将客户端操作放入 ClientViewModel,而不是将所有内容放入 MainWindowViewModel。
  • 非常感谢您的见解:)。非常感谢,我一定会查看 Caliburn.Micro
  • @CodingMadeEasy 如果您发现一个有用的答案,您应该投票和/或接受它。您已经发布了 20 个问题,但只接受了一个答案。我想你忘记了什么。您应该访问 your questions 并确保您已投票并接受所有适当的答案。
  • 谢谢。我已经投票赞成你的回答,稍后我会在其他问题上这样做。不过,我还有一个问题。在这种情况下使用聚合而不是组合是否有额外的好处?另外,在这种情况下您将如何实现聚合?
  • @CodingMadeEasy 聚合与组合是什么拥有什么的问题。在这种情况下,您选择什么并不重要。
猜你喜欢
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多