你怎么知道ItemsControl的哪个元素在MVVM中发送一个事件?

时间:2011-08-10 15:12:35

标签: c# wpf xaml mvvm

假设我目前有一个ItemsControl,其DataTemplate是一堆按钮。我正在连接这些按钮的点击事件,但我怎么知道点击了哪个按钮?我应该不使用ItemsControl吗?

我试图没有代码隐藏,但务实可能是必要的。

<ItemsControl>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Margin="10">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding ItemsControlButtonClicked, Mode=OneWay}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

5 个答案:

答案 0 :(得分:4)

如果您想知道点击的Item是什么,请将{Binding }作为CommandParameter传递,它会将所选对象传递给您的命令

如果你想知道点击了什么Button,我会在代码隐藏中这样做,因为ViewModels不需要知道关于UI的任何信息,包括按钮。

此外,由于您的控件是Button,因此您应该使用Command属性而不是Click触发器。

<Button Command="{Binding ItemsControlButtonClicked}" />

答案 1 :(得分:0)

您可以将参数与命令一起发送,并根据这些参数,您可以找到单击的按钮

答案 2 :(得分:0)

在我的项目中我也使用MVVM Light我有一个带有项目集合的下拉列表,还有一个按钮,用户按下并且操作取决于从下拉列表中选择的项目 您应该使用参数查看我的代码中的示例

创建一个Relay命令
  public RelayCommand<Project> StartTimer { get; private set; }//declare command

   StartTimer = new RelayCommand<Project>(OnStartTimer);

    private void OnStartTimer(Project project)
    {

        if (project != null)
        {

            currentProject = project;

            if (!timer.IsTimerStopped)
            {
                timer.StopTimer();
            }
            else
            {
                Caption = "Stop";
                timer.StartTimer();
            }
        }

在视图上我将下拉列表与Project类的集合绑定 对于按钮命令参数,我将选中的项目表格下拉  看一下代码

   <ComboBox Name="projectcomboBox" ItemsSource="{Binding Path=Projects}"    IsSynchronizedWithCurrentItem="True" DisplayMemberPath="FullName"
              SelectedValuePath="Name"  SelectedIndex="0"  >
    </ComboBox>
      <Button Name="timerButton" Content="{Binding Path=Caption}" Command="{Binding Path=StartTimer}" 
                CommandParameter="{Binding ElementName=projectcomboBox, Path=SelectedItem}"  ></Button>

注意Command和CommandParameter绑定

你也可以使用这种方法,而不仅仅是下拉

答案 3 :(得分:0)

好吧,你可以使用Sender.DataContext,这是实际的数据。

答案 4 :(得分:0)

在视图模型类中创建命令属性(使用Josh Smith的RelayCommand模式是最简单的方法)并将每个按钮的Command绑定到相应的按钮。这不仅简单易行,而且易于维护,它还为您提供了在需要时实现启用/禁用行为的简便方法。