假设我目前有一个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>
答案 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
绑定到相应的按钮。这不仅简单易行,而且易于维护,它还为您提供了在需要时实现启用/禁用行为的简便方法。