WPF 命令传参多个按钮绑定同一个命令执行不同的操作
▲ 以对象的形式硬编码传参。
▲ 不同按钮绑定同一个命令,执行不同的操作。
XAML:
<Window.DataContext>
<local:MainVM/>
</Window.DataContext>
<Grid>
<StackPanel Margin="15">
<TextBlock Text="传递对象参数" FontWeight="Bold" FontSize="12" Margin="0,5,0,5" ></TextBlock>
<DockPanel>
<StackPanel DockPanel.Dock="Left" VerticalAlignment="Center">
<Button Command="{Binding PassArgObjCmd}" Content="传递多个参数" Height="23" HorizontalAlignment="Left" Width="100">
<Button.CommandParameter>
<local:UserParam UserName="悟空" UserPhone="110" UserAdd="花果山" UserSex="男" ></local:UserParam>
</Button.CommandParameter>
</Button>
<Button Content="吃香蕉" Command="{Binding EatWhatCommand}" Margin="0 10 0 0">
<Button.CommandParameter>
<local:Food>Banana</local:Food>
</Button.CommandParameter>
</Button>
<Button Content="吃桃子" Command="{Binding EatWhatCommand}" Margin="0 10 0 0">
<Button.CommandParameter>
<local:Food>Peach</local:Food>
</Button.CommandParameter>
</Button>
<Button Content="吃苹果" Command="{Binding EatWhatCommand}" Margin="0 10 0 0">
<Button.CommandParameter>
<local:Food>Apple</local:Food>
</Button.CommandParameter>
</Button>
</StackPanel>
<StackPanel DockPanel.Dock="Right" Margin="50 0 0 0" VerticalAlignment="Center" Orientation="Vertical">
<TextBlock Text="{Binding ObjParam.UserName,StringFormat='姓名:\{0\}'}" ></TextBlock>
<TextBlock Text="{Binding ObjParam.UserPhone,StringFormat='电话:\{0\}'}" ></TextBlock>
<TextBlock Text="{Binding ObjParam.UserAdd,StringFormat='地址:\{0\}'}" ></TextBlock>
<TextBlock Text="{Binding ObjParam.UserSex,StringFormat='性别:\{0\}'}" ></TextBlock>
</StackPanel>
</DockPanel>
</StackPanel>
</Grid>
枚举:
public enum Food
{
Banana,
Peach,
Apple,
}
Model:
public class UserParam
{
public String UserName { get; set; }
public String UserPhone { get; set; }
public String UserAdd { get; set; }
public String UserSex { get; set; }
}
ViewModel:
public class MainVM : ViewModelBase
{
#region 传递参数对象
private UserParam objParam;
public UserParam ObjParam
{
get { return objParam; }
set { objParam = value; RaisePropertyChanged(() => ObjParam); }
}
#endregion
#region 命令
private RelayCommand<UserParam> passArgObjCmd;
public RelayCommand<UserParam> PassArgObjCmd
{
get
{
if (passArgObjCmd == null)
passArgObjCmd = new RelayCommand<UserParam>((p) => ExecutePassArgObj(p));
return passArgObjCmd;
}
set { passArgObjCmd = value; }
}
private void ExecutePassArgObj(UserParam up)
{
ObjParam = up;
}
private RelayCommand<Food> _eatWhatCommand;
public RelayCommand<Food> EatWhatCommand
{
get
{
if (_eatWhatCommand == null)
_eatWhatCommand = new RelayCommand<Food>(Eat);
return _eatWhatCommand;
}
set
{
_eatWhatCommand = value;
}
}
private void Eat(Food food)
{
switch (food)
{
case Food.Banana:
MessageBox.Show("吃香蕉");
break;
case Food.Peach:
MessageBox.Show("吃桃子");
break;
case Food.Apple:
MessageBox.Show("吃苹果");
break;
}
}
#endregion
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了