如何将多个命令参数传递给按钮 WPF?
How can I pass multiple command parameters to a button WPF?
设置上下文:
我有一个包含多种数据类型的数据网格。对于每种类型,我都有一个自定义数据模板,用于详细信息以适合我的数据。在细节上,我有一个带有文本框和 2 个按钮的小表单。 objective是在点击按钮的时候获取我行的数据和文本框的内容。
目前,我已经用这些参数创建了一个 class,我正在尝试以这种方式将此 class 传递给我的命令参数:
<Button Content="Validate" Width="70" Command="{Binding Source={StaticResource btnVmValidateReserved}, Path=ButtonValidateReservedCommand}">
<Button.CommandParameter>
<model:ButtonValidateReservedCommandArgs Item="{Binding Data}" Message="{Binding Path=Text, ElementName=umMasterComment}"/>
</Button.CommandParameter>
</Button>
这是我的 class :
public class ButtonValidateReservedCommandArgs : DependencyObject
{
public static readonly DependencyProperty ItemProperty = DependencyProperty.Register("Item", typeof(object), typeof(ButtonValidateReservedCommandArgs));
public object Item
{
get { return GetValue(ItemProperty); }
set { SetValue(ItemProperty, value); }
}
public static readonly DependencyProperty MessageProperty = DependencyProperty.Register("Message", typeof(string), typeof(ButtonValidateReservedCommandArgs));
public string Message
{
get { return (string)GetValue(MessageProperty); }
set { SetValue (MessageProperty, value); }
}
}
当我尝试使用绑定时,结果总是 null。但是当我尝试用随机文本来做时,它起作用了。
另外,当我尝试这样做时它起作用了:
<Button Content="Validate" Width="70" Command="{Binding Source={StaticResource btnVmValidateReserved}, Path=ButtonValidateReservedCommand}" CommandParameter="{Binding Data}"/>
但是,我需要我的 2 个论点,但我想不通。
如果你有任何想法有一个有效的绑定,或者甚至是另一个解决方案来传递我的 2 个参数,我会接受它。
谢谢
为了传递多个参数,您可以这样做:
<Button Command="{Binding YourCommand">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource CloneMultiConverter}">
<Binding Path="Argument1"/>
<Binding Path="Argument2"/>
</MultiBinding>
</Button.CommandParameter>
</Button>
public class CloneMultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values.Clone();
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
private void YourCommand(object parameter)
{
var values = (object[])parameter;
var firstArgument = (argumentType)values[0];
var secondArgument = (argumentType)values[1];
}
设置上下文:
我有一个包含多种数据类型的数据网格。对于每种类型,我都有一个自定义数据模板,用于详细信息以适合我的数据。在细节上,我有一个带有文本框和 2 个按钮的小表单。 objective是在点击按钮的时候获取我行的数据和文本框的内容。
目前,我已经用这些参数创建了一个 class,我正在尝试以这种方式将此 class 传递给我的命令参数:
<Button Content="Validate" Width="70" Command="{Binding Source={StaticResource btnVmValidateReserved}, Path=ButtonValidateReservedCommand}">
<Button.CommandParameter>
<model:ButtonValidateReservedCommandArgs Item="{Binding Data}" Message="{Binding Path=Text, ElementName=umMasterComment}"/>
</Button.CommandParameter>
</Button>
这是我的 class :
public class ButtonValidateReservedCommandArgs : DependencyObject
{
public static readonly DependencyProperty ItemProperty = DependencyProperty.Register("Item", typeof(object), typeof(ButtonValidateReservedCommandArgs));
public object Item
{
get { return GetValue(ItemProperty); }
set { SetValue(ItemProperty, value); }
}
public static readonly DependencyProperty MessageProperty = DependencyProperty.Register("Message", typeof(string), typeof(ButtonValidateReservedCommandArgs));
public string Message
{
get { return (string)GetValue(MessageProperty); }
set { SetValue (MessageProperty, value); }
}
}
当我尝试使用绑定时,结果总是 null。但是当我尝试用随机文本来做时,它起作用了。
另外,当我尝试这样做时它起作用了:
<Button Content="Validate" Width="70" Command="{Binding Source={StaticResource btnVmValidateReserved}, Path=ButtonValidateReservedCommand}" CommandParameter="{Binding Data}"/>
但是,我需要我的 2 个论点,但我想不通。
如果你有任何想法有一个有效的绑定,或者甚至是另一个解决方案来传递我的 2 个参数,我会接受它。
谢谢
为了传递多个参数,您可以这样做:
<Button Command="{Binding YourCommand">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource CloneMultiConverter}">
<Binding Path="Argument1"/>
<Binding Path="Argument2"/>
</MultiBinding>
</Button.CommandParameter>
</Button>
public class CloneMultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values.Clone();
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
private void YourCommand(object parameter)
{
var values = (object[])parameter;
var firstArgument = (argumentType)values[0];
var secondArgument = (argumentType)values[1];
}