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 的时候,可以硬编码传递一个参数,让它分别执行不同的功能。




posted @   double64  阅读(911)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示