0

我有一个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,并且可以通过RelayCommands我的 ViewModel 为包含多个 this 实例的 View绑定到这些命令UserControl。我希望能够为CommandParameters我的 UserControl 上的每个命令公开个人。这可能吗?

将来,我还希望整个UserControl(基本上是直接包含在其中的网格)公开其他事件的命令(单击、拖放和数据删除),同样,每个事件都会公开自己的CommandParameters.

我没有找到太多关于多重CommandCommandParameter配对的信息,所以我想知道我是否采取了错误的方法。会CustomControl更合适吗?或者最好使用 a 来解决这个问题DataTemplate?将诸如单击和拖动之类的事件作为命令公开似乎也没有太多的覆盖范围 - 是否有更好的容器控件可以满足我的需求?

4

1 回答 1

1

您可以创建RelayCommand以接受CommandParameter这样的 -

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

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

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

Execute 方法以 Action 的形式传递给 RelayCommand 的构造函数(如果命令有参数,则为 Action,在这种情况下,您必须使用 RelayCommand 类)。

在 Silverlight 3 和 WPF 中使用 RelayCommands

参考。: -为 MVVM Light V4 提出一个新的 RelayCommand 片段

然后使用CommandParameter的属性传递参数Button

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

或者

<Button Command="{Binding CloseCommand }" 
        CommandParameter="True" ... />
于 2012-06-26T11:30:11.730 回答