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