糟糕的MVVM实践?(CommandParameter)
本文关键字:CommandParameter 实践 MVVM | 更新日期: 2023-09-27 18:18:37
在我的代码我有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>
ViewModel:
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的?
提前感谢您的回答:)
这是值得商榷的做法。问问你自己:如果你正在创建方法而不是命令,你会将它们命名为"Update"并将要更新的内容作为"字符串参数"传递,还是你宁愿使用有意义的名称来单独使用方法?
您的公共接口变得不那么清晰(您需要记录作为"参数"传递的内容),您使您的设计变得更加脆弱(一个错字不会导致任何错误或警告),您引入了神奇常量。总的来说,您使代码变得更糟。如果你想看的话,可以再短一点。
如果您想避免为每个操作创建命令(这会变得冗长而令人讨厌),您可以使用MVVM库,它不会强制您这样做。例如,Caliburn。在Micro中,您可以只使用三个方法和三个按钮,而无需使用命令和参数。