WPF 命令动态传递参数
如果需要传递多个参数,可以将多个参数封装成一个对象进行传递。命令用 RelayCommand<T>
泛型。
▲ 点击“传递按钮”,将左边的 TextBox 内容传递到右边 TextBlock 中去。
XAML:
<Window.DataContext>
<local:MainVM/>
</Window.DataContext>
<Grid>
<Grid.Resources>
<local:UserInfoConvert x:Key="uic" />
</Grid.Resources>
<StackPanel Margin="10,0,0,50">
<TextBlock Text="动态参数传递" FontWeight="Bold" FontSize="12" Margin="0,5,0,5" ></TextBlock>
<StackPanel Orientation="Horizontal" >
<StackPanel Orientation="Vertical" Margin="0,0,10,0" >
<StackPanel Orientation="Horizontal" Margin="0,0,0,5" >
<TextBlock Text="姓名" Width="80" ></TextBlock>
<TextBox x:Name="txtUName" Width="200" />
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,0,5" >
<TextBlock Text="电话" Width="80" ></TextBlock>
<TextBox x:Name="txtUPhone" Width="200" />
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,0,5" >
<TextBlock Text="地址" Width="80"></TextBlock>
<TextBox x:Name="txtUAdd" Width="200"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,0,5" >
<TextBlock Text="性别" Width="80" ></TextBlock>
<TextBox x:Name="txtUSex" Width="200" />
</StackPanel>
</StackPanel>
<StackPanel>
<Button Content="点击传递" Command="{Binding DynamicParamCmd}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource uic}">
<Binding ElementName="txtUName" Path="Text"/>
<Binding ElementName="txtUSex" Path="Text"/>
<Binding ElementName="txtUPhone" Path="Text"/>
<Binding ElementName="txtUAdd" Path="Text"/>
</MultiBinding>
</Button.CommandParameter>
</Button>
</StackPanel>
<StackPanel Width="240" Orientation="Vertical" Margin="10,0,0,0" >
<TextBlock Text="{Binding ArgsTo.UserName,StringFormat='姓名:\{0\}'}" ></TextBlock>
<TextBlock Text="{Binding ArgsTo.UserPhone,StringFormat='电话:\{0\}'}" ></TextBlock>
<TextBlock Text="{Binding ArgsTo.UserAdd,StringFormat='地址:\{0\}'}" ></TextBlock>
<TextBlock Text="{Binding ArgsTo.UserSex,StringFormat='性别:\{0\}'}" ></TextBlock>
</StackPanel>
</StackPanel>
</StackPanel>
</Grid>
Model:
public class UserParam : ObservableObject
{
private string _userName;
public String UserName
{
get
{
return _userName;
}
set
{
_userName = value;
RaisePropertyChanged(nameof(UserName));
}
}
private string _userPhone;
public String UserPhone
{
get
{
return _userPhone;
}
set
{
_userPhone = value;
RaisePropertyChanged(nameof(UserPhone));
}
}
private string _userAdd;
public String UserAdd
{
get { return _userAdd; }
set
{
_userAdd = value;
RaisePropertyChanged(nameof(UserAdd));
}
}
private string _userSex;
public String UserSex
{
get { return _userSex; }
set { _userSex = value; RaisePropertyChanged(nameof(UserSex)); }
}
}
Convert:
public class UserInfoConvert : IMultiValueConverter
{
/// <summary>
/// 对象转换
/// </summary>
/// <param name="values">所绑定的源的值</param>
/// <param name="targetType">目标的类型</param>
/// <param name="parameter">绑定时所传递的参数</param>
/// <param name="culture"><系统语言等信息</param>
/// <returns></returns>
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (!values.Cast<string>().Any(text => string.IsNullOrEmpty(text)) && values.Count() == 4)
{
UserParam up = new UserParam() { UserName = values[0].ToString(), UserSex = values[1].ToString(), UserPhone = values[2].ToString(), UserAdd = values[3].ToString() };
return up;
}
return null;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
ViewModel:
public class MainVM : ViewModelBase
{
#region 动态参数传递
private UserParam argsTo;
/// <summary>
/// 动态参数传递
/// </summary>
public UserParam ArgsTo
{
get { return argsTo; }
set { argsTo = value; RaisePropertyChanged(() => ArgsTo); }
}
#endregion
//=================================================================================================================
private RelayCommand<UserParam> dynamicParamCmd;
/// <summary>
/// 动态参数传递
/// </summary>
public RelayCommand<UserParam> DynamicParamCmd
{
get
{
if (dynamicParamCmd == null)
dynamicParamCmd = new RelayCommand<UserParam>(p => ExecuteDynPar(p));
return dynamicParamCmd;
}
set
{
dynamicParamCmd = value;
}
}
private void ExecuteDynPar(UserParam up)
{
ArgsTo = up;
}
}
这种方式应该是用的不多的,因为使用绑定会自动更新了。在多个页面对应一个 ViewModel 的时候,可以硬编码传递一个参数,让它分别执行不同的功能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了