坏MVVM的做法? (CommandParameter)

时间:2014-08-17 22:47:28

标签: c# wpf mvvm parameters command

在我的代码中,我有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&#39; s?

提前感谢您的回答:)

1 个答案:

答案 0 :(得分:3)

这是可疑的练习。问问自己:如果你正在创建方法而不是命令,你会为它们命名吗?#34;更新&#34;并将更新内容作为&#34;字符串参数传递给#34;,或者您更愿意使用具有有意义名称的单独方法?

您的公共界面变得不那么清晰(您需要记录传递的内容为&#34; param&#34;),您的设计更加脆弱(错字不会导致任何错误或警告),您引入魔法常量。总的来说,你使你的代码变得更糟。但是,如果这是你追求的目标,那就短一点。

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