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





免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM