7

我正在使用 MVVM 设计模式开发 WPF 应用程序。在应用程序中,我有一个 ItemsControl 显示几个按钮(按钮的数量不是恒定的,根据应用程序的逻辑流程)。ItemsControl 绑定到 ViewModel 中的 LinkedList。我能够为按钮定义一个命令,并且只有当命令没有参数时,我才能在 ViewModel 中获取命令处理程序......我需要能够知道单击了哪个按钮,因此我想拥有带参数的命令。

我需要如何定义我的 View ?CommandParameter 的语法是什么,我可以使用哪个参数来获取 Button 内容?ViewModel 中的 Command 签名是什么?

请注意,我使用的是 MVVM Light 的 RelayCommand。视图的相关代码在这里。提前致谢

<UserControl x:Class="Museum.Controls.CategoriesView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="130" d:DesignWidth="418">
    <UserControl.Resources>
        <DataTemplate x:Key="CategoriesButtonsTemplate">
            <Button Content="{Binding }" 
                    Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, Path=DataContext.CategorySelectedCommand}" 
                    />
        </DataTemplate>
    </UserControl.Resources>
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="50"></RowDefinition>
            <RowDefinition Height=" 40"></RowDefinition>
            <RowDefinition Height=" 40"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid x:Name="SubSubjectGrid" Grid.Row="0"></Grid>
        <Grid x:Name="CategoriesGrid" Grid.Row="1">
            <ItemsControl Grid.Row="1" 
                  ItemsSource="{Binding Path=CategoriesButtons}" 
                  ItemTemplate="{StaticResource CategoriesButtonsTemplate}" >
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal"  HorizontalAlignment="Stretch"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
     </Grid>
        <Grid x:Name="SelectedCategoryGrid" Grid.Row="2"></Grid>
    </Grid>  
</UserControl>
4

3 回答 3

6

您可以像这样简单地使用 CommandParameter="{Binding }"

       <DataTemplate x:Key="CategoriesButtonsTemplate">
        <Button Content="{Binding }" 
                Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, Path=DataContext.CategorySelectedCommand}" 
                CommandParameter="{Binding }" 
                />
    </DataTemplate>
于 2013-10-07T05:43:37.243 回答
1

MVVM Light 工具包中有一个通用的 RelayCommand 类,可以处理命令参数。非通用 RelayCommand 类会忽略它们。这是一个例子:

首先绑定您的 CommandParameter 属性,如 Ahmed 在他的回答中所示:

    <Button Content="{Binding}" 
            Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, Path=DataContext.CategorySelectedCommand}" 
            CommandParameter="{Binding}" />

假设您的视图模型中按钮的链接列表是字符串列表。您的按钮内容和您的 CommandParameter 绑定到您的列表项之一。现在在您的视图模型中创建一个通用的 RelayCommand 属性:

 private RelayCommand<String> mOnClickCommand;

 public RelayCommand<String> ClickCommand
 {
     get { return mOnClickCommand; }         
 }

例如,在您的构造函数中实例化它:

 mOnClickCommand = new RelayCommand<string>(OnButtonClicked);

最后在您的方法中,您将获得 CommandParameter 属性作为方法参数:

 private void OnButtonClicked(String _category)
 {
     Console.WriteLine(_category);
 }

希望这会有所帮助。

于 2013-10-07T14:13:56.113 回答
0

您可以使用交互和迭代库。在这种情况下,您应该将此添加到按钮的 xaml 代码中:

<Button>
  <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
              <ei:CallMethodAction TargetObject="{Binding}" MethodName="OnClick"/>
        </i:EventTrigger>
  </i:Interaction.Triggers>
</Button>

并查看模型:

public void OnClick(object sender, MouseEventArgs args)
{// your code }
于 2013-10-07T13:00:20.650 回答