如何使用多个参数调用 RelayCommand?
How do I invoke RelayCommand with multiple parameters?
我需要更改我们编写的 WPF 应用程序中的某些功能。我们使用 MVVM Light 来实现 MVVM。每当我们需要将一些参数传递给方法时,我们都会使用 MVVM Light 的 Messenger class。我必须将 3 个参数传递给一个方法,但我想我会尝试在不使用 Messenger class 的情况下执行此操作,但我希望我可以使用 RelayCommand() 方法来执行此操作。几年前,我进行了搜索并在 SO 上找到了 this post。但至少对我来说,我认为这不会起作用,因为它只使用一种类型;在这种情况下是字符串。在做了一些试验并意识到我做错了之后,我决定我可以创建一个 class,其中包含我需要的 3 个值作为 class 的属性,将其放入 Models 文件夹中,然后使用
new RelayCommand<MyClass>()
所以,第一个问题,只是为了验证我的想法是否正确,我想我会做这样的事情:
new RelayCommand<MyClass>((mc) => MyMethod(mc.Prop_A, mc.Prop_B, mc.Prop_C)
对吗?
假设上面的答案是肯定的,那么当我在XAML中绑定到它时,我如何实际将参数传递给它?此命令将与 window/page 上的按钮相关联,因此我将使用按钮的命令 属性。我如何实际传递 MyClass 实例 Prop_A、Prop_B 和 Prop_C 的值?
So, first question, just to verify that I've got the right idea, I think I would do something like this:
new RelayCommand<MyClass>((mc) => MyMethod(mc.Prop_A, mc.Prop_B, mc.Prop_C)
Is that correct?
是的,是的。
How do I actually pass in the values for the MyClass instances Prop_A, Prop_B and Prop_C?
只需创建一个 class 实例,将 xaml 中的参数保存为命令参数:
<Button Command="{Binding Command}">
<Button.CommandParameter>
<local:MyClass Prop_A="a value" Prop_B="b value" Prop_C="c value" />
</Button.CommandParameter>
</Button>
So, first question, just to verify that I've got the right idea, I
think I would do something like this:
new RelayCommand<MyClass>((mc) => MyMethod(mc.Prop_A, mc.Prop_B, mc.Prop_C)
这是正确的。
Assuming the answer to the above is yes, then how do I actually pass
parameters to this when I bind to it in the XAML? This command is
going to be associated with a button on the window/page, so I'll be
using the Button's Command property. How do I actually pass in the
values for the MyClass instances Prop_A, Prop_B and Prop_C?
这实际上取决于 Prop_A、Prop_B 和 Prop_C 的来源。如果这些属性已经在您的视图模型中,则无需使用 XAML.
传递参数
new RelayCommand<MyClass>((mc) => MyMethod(mc.Prop_A, mc.Prop_B, mc.Prop_C)
将更改为
new RelayCommand<object>((param) =>
{
// param is not used.
var mc = this.MC; // assuming your view model holds the mc value
MyMethod(mc.Prop_A, mc.Prop_B, mc.Prop_C);
});
我们必须确保加载视图模型时,我们拥有所需的一切。否则,请使用 IoC
来获取您需要的任何内容。
将参数绑定到您的命令通常对像计算器应用程序这样的东西很有用,您可以在其中将按钮值传递给您的命令,例如 0 - 9。
<Button Grid.Row="0" Grid.Column="1" Content="7" Command="{Binding PerformAction}" CommandParameter="7"/>
我不想在您看来定义 类。对于关注点分离,视图应该只知道要绑定的属性而不是模型。
还有另一种方法可以使用 IMultiValueConverter
来做到这一点:
class MultiValueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
foreach (var item in values)
{
//process the properties passed in and you will need to unbox those parameters
}
return new object();
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后在xaml(按钮代码)中:
<Button Content="Test" Style="{StaticResource contextMenuAware}" Command="{Binding MultiParameterCommand}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource MultiValueConverter}">
<Binding Path="Items"/>
<!-- Pass more Bindings here or static values -->
</MultiBinding>
</Button.CommandParameter>
</Button>
这是包含转换器的代码:
xmlns:converter="clr-namespace:SO_app.Converters"
然后在你Window资源标签:
<converter:MultiValueConverter x:Key="MultiValueConverter"/>
这样你就可以在传递参数时使用 Binding 而无需实现 DependencyProperties
.
我是这样做的:
您的 CommandRelay 对象将对象作为参数,您将该对象转换为对象[],然后将每个元素转换为它自己的对象。
private RelayCommand<object> _YourCommand;
public RelayCommand<object> YourCommand
{
get
{
return _YourCommand ?? (_YourCommand = new RelayCommand<object>(p =>
{
var values = (object[]) p;
int item1 = int.Parse(values[0].ToString());
string item2 = values[1].ToString();
double item3 = double.Parse(values[2].ToString());
}));
}
}
然后,在xaml(当然,你的Paths in Binding必须是对你绑定对象的有效引用)
<Button Command="{Binding YourCommand}">
<Button.CommandParameter>
<MultiBinding>
<Binding Path="Item1"/>
<Binding Path="Item2"/>
<Binding Path="Item3"/>
</MultiBinding>
</Button.CommandParameter>
</Button>
我需要更改我们编写的 WPF 应用程序中的某些功能。我们使用 MVVM Light 来实现 MVVM。每当我们需要将一些参数传递给方法时,我们都会使用 MVVM Light 的 Messenger class。我必须将 3 个参数传递给一个方法,但我想我会尝试在不使用 Messenger class 的情况下执行此操作,但我希望我可以使用 RelayCommand() 方法来执行此操作。几年前,我进行了搜索并在 SO 上找到了 this post。但至少对我来说,我认为这不会起作用,因为它只使用一种类型;在这种情况下是字符串。在做了一些试验并意识到我做错了之后,我决定我可以创建一个 class,其中包含我需要的 3 个值作为 class 的属性,将其放入 Models 文件夹中,然后使用
new RelayCommand<MyClass>()
所以,第一个问题,只是为了验证我的想法是否正确,我想我会做这样的事情:
new RelayCommand<MyClass>((mc) => MyMethod(mc.Prop_A, mc.Prop_B, mc.Prop_C)
对吗?
假设上面的答案是肯定的,那么当我在XAML中绑定到它时,我如何实际将参数传递给它?此命令将与 window/page 上的按钮相关联,因此我将使用按钮的命令 属性。我如何实际传递 MyClass 实例 Prop_A、Prop_B 和 Prop_C 的值?
So, first question, just to verify that I've got the right idea, I think I would do something like this:
new RelayCommand<MyClass>((mc) => MyMethod(mc.Prop_A, mc.Prop_B, mc.Prop_C)
Is that correct?
是的,是的。
How do I actually pass in the values for the MyClass instances Prop_A, Prop_B and Prop_C?
只需创建一个 class 实例,将 xaml 中的参数保存为命令参数:
<Button Command="{Binding Command}">
<Button.CommandParameter>
<local:MyClass Prop_A="a value" Prop_B="b value" Prop_C="c value" />
</Button.CommandParameter>
</Button>
So, first question, just to verify that I've got the right idea, I think I would do something like this:
new RelayCommand<MyClass>((mc) => MyMethod(mc.Prop_A, mc.Prop_B, mc.Prop_C)
这是正确的。
Assuming the answer to the above is yes, then how do I actually pass parameters to this when I bind to it in the XAML? This command is going to be associated with a button on the window/page, so I'll be using the Button's Command property. How do I actually pass in the values for the MyClass instances Prop_A, Prop_B and Prop_C?
这实际上取决于 Prop_A、Prop_B 和 Prop_C 的来源。如果这些属性已经在您的视图模型中,则无需使用 XAML.
传递参数new RelayCommand<MyClass>((mc) => MyMethod(mc.Prop_A, mc.Prop_B, mc.Prop_C)
将更改为
new RelayCommand<object>((param) =>
{
// param is not used.
var mc = this.MC; // assuming your view model holds the mc value
MyMethod(mc.Prop_A, mc.Prop_B, mc.Prop_C);
});
我们必须确保加载视图模型时,我们拥有所需的一切。否则,请使用 IoC
来获取您需要的任何内容。
将参数绑定到您的命令通常对像计算器应用程序这样的东西很有用,您可以在其中将按钮值传递给您的命令,例如 0 - 9。
<Button Grid.Row="0" Grid.Column="1" Content="7" Command="{Binding PerformAction}" CommandParameter="7"/>
我不想在您看来定义 类。对于关注点分离,视图应该只知道要绑定的属性而不是模型。
还有另一种方法可以使用 IMultiValueConverter
来做到这一点:
class MultiValueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
foreach (var item in values)
{
//process the properties passed in and you will need to unbox those parameters
}
return new object();
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后在xaml(按钮代码)中:
<Button Content="Test" Style="{StaticResource contextMenuAware}" Command="{Binding MultiParameterCommand}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource MultiValueConverter}">
<Binding Path="Items"/>
<!-- Pass more Bindings here or static values -->
</MultiBinding>
</Button.CommandParameter>
</Button>
这是包含转换器的代码:
xmlns:converter="clr-namespace:SO_app.Converters"
然后在你Window资源标签:
<converter:MultiValueConverter x:Key="MultiValueConverter"/>
这样你就可以在传递参数时使用 Binding 而无需实现
DependencyProperties
.
我是这样做的:
您的 CommandRelay 对象将对象作为参数,您将该对象转换为对象[],然后将每个元素转换为它自己的对象。
private RelayCommand<object> _YourCommand; public RelayCommand<object> YourCommand { get { return _YourCommand ?? (_YourCommand = new RelayCommand<object>(p => { var values = (object[]) p; int item1 = int.Parse(values[0].ToString()); string item2 = values[1].ToString(); double item3 = double.Parse(values[2].ToString()); })); } }
然后,在xaml(当然,你的Paths in Binding必须是对你绑定对象的有效引用)
<Button Command="{Binding YourCommand}">
<Button.CommandParameter>
<MultiBinding>
<Binding Path="Item1"/>
<Binding Path="Item2"/>
<Binding Path="Item3"/>
</MultiBinding>
</Button.CommandParameter>
</Button>