WPF的MVVM开发,批量添加UIbutton按钮时,传入同一个Command,如何在调用command时区分由哪个按钮触发
时间: 2024-10-23 13:02:22 浏览: 14
多个单选按钮的WPF MVVM绑定
在WPF的MVVM开发中,当你需要批量添加`UIButton`按钮,并且它们都绑定了同一个`Command`,但实际上你需要在执行`Command`时能够区分是由哪个特定按钮触发的,你可以这样做:
1. **创建一个命令**:在你的视图模型(ViewModel)中,创建一个带有一个标识参数的命令,比如`ICommand RelayCommand`(使用`System.Windows.Input`命名空间下的`RelayCommand`),它接受一个附加参数来标记按钮来源。
```csharp
using System.Windows.Input;
public class ButtonCommand : ICommand
{
private readonly Action<string> _executeAction;
private readonly object _canExecuteParameter;
public ButtonCommand(Action<string> executeAction, object canExecuteParameter)
{
_executeAction = executeAction ?? throw new ArgumentNullException(nameof(executeAction));
_canExecuteParameter = canExecuteParameter;
}
public bool CanExecute(object parameter)
{
return true; // 根据实际情况判断是否允许执行
}
public event EventHandler CanExecuteChanged { add { } remove { } }
public void Execute(object parameter)
{
if (parameter != null && parameter is string buttonId)
_executeAction(buttonId);
}
}
```
2. **添加按钮时指定命令**:在XAML中,给每个按钮传递一个唯一的标识,作为`CommandParameter`,并在`Button`的`Command`属性上使用这个带有标识的命令实例。
```xml
<Button Content="Button 1" Command="{Binding Button1Command, CommandParameter='Button1'}"/>
<Button Content="Button 2" Command="{Binding Button1Command, CommandParameter='Button2'}"/>
<!--...其他按钮...-->
```
3. **执行命令时获取标识**:在视图模型中,当`ButtonCommand`的`Execute`方法被调用时,可以从`parameter`中获取标识并根据此执行相应操作。
```csharp
private readonly Dictionary<string, Action<string>> _buttonActions = new Dictionary<string, Action<string>>();
public ButtonCommand Button1Command => new ButtonCommand(OnButtonClick, "Button1");
private void OnButtonClick(string buttonId)
{
if (_buttonActions.TryGetValue(buttonId, out var action))
action(buttonId); // 执行对应的按钮操作
}
```
现在,每个按钮的`Command`都会将触发的按钮标识传递给`Execute`方法,从而使你能区分是由哪个按钮触发的。
阅读全文