从UserControl公开多个命令,每个命令具有不同的CommandParameters

时间:2012-06-26 10:59:24

标签: c# wpf mvvm command commandparameter

我有一个包含多个按钮的UserControl,对于每个按钮,我都定义了Command DependencyProperty。 UserControl XAML是(为简洁起见,删除了一些元素):

<UserControl>
   <Grid>
      <Button Command="{Binding CloseCommand, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" ToolTip="Delete">
      <Button Command="{Binding NavigateCommand, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" ToolTip="Launch">
   </Grid>
</UserControl>

UserControl代码隐藏中的DepencyProperties是:

public static readonly DependencyProperty CloseCommandProperty = DependencyProperty.Register("CloseCommand", typeof (ICommand), typeof (Tile));

public ICommand CloseCommand
{
    get { return (ICommand)GetValue(CloseCommandProperty); }
    set { SetValue(CloseCommandProperty, value); }
}

public static readonly DependencyProperty NavigateCommandProperty = DependencyProperty.Register("NavigateCommand", typeof (ICommand), typeof (Tile));

public ICommand NavigateCommand
{
    get { return (ICommand) GetValue(NavigateCommandProperty); }
    set { SetValue(NavigateCommandProperty, value); }
}

我正在使用MVVM Light,我可以通过我的ViewModel上的RelayCommands为包含此UserControl的多个实例的View绑定到这些命令。我希望能够为我的UserControl上的每个命令公开单个CommandParameters。这可能吗?

将来我也希望整个UserControl(基本上是包含在其中的网格)来公开其他事件(点击,拖动和数据丢弃)的命令,同样,每个事件都会暴露自己的{ {1}}。

我没有找到关于多个CommandParametersCommand配对的大量信息,所以我想知道我是否采取了错误的方法。 CommandParameter会更合适吗?或者使用CustomControl最好解决这个问题?在网格上公开点击和拖动等事件作为命令似乎也没有太大的覆盖范围 - 是否有更好的容器控制能够满足我的需求?

1 个答案:

答案 0 :(得分:1)

您可以创建RelayCommand以接受此类CommandParameter -

closeCommand = new RelayCommand<bool>((flag) => Close(flag));

private void Test(bool flag)
{
    if(flag)
       CloseWindow();
}

即。通过使用通用RelayCommand<T>实现;

  

Execute方法以表单的形式传递给RelayCommand的构造函数   一个Action(如果命令有参数,则为Action,其中)   你必须使用RelayCommand类。

     

Using RelayCommands in Silverlight 3 and WPF

     

参考。 : - Proposing a new RelayCommand snippet for MVVM Light V4

然后使用CommandParameter的{​​{1}}属性传递参数。

Button

或者

<Button Command="{Binding CloseCommand }" 
        CommandParameter="{Binding SomeCommandParameter}" ... />