这是我xaml
<ListBox x:Name="HistoryList"
ItemsSource="{Binding HistoryCollection}"
>
<ListBox.ItemTemplate >
</DataTemplate>
<CheckBox x:Name="UpCheckBox" Height="50" Width="50" >
<interactivity:Interaction.Triggers>
<interactivity:EventTrigger EventName="Checked">
<interactivity:InvokeCommandAction Command="{Binding UpCheckedCommad}" CommandParameter="{Binding ElementName=UpCheckBox}"></interactivity:InvokeCommandAction>
</interactivity:EventTrigger>
</interactivity:Interaction.Triggers>
</CheckBox>
</DataTemplate>
</ListBox.ItemTemplate >
</ListBox >
在ViewModel
中,我使用了GalasoftMVVM Command Binding
public ICommand UpCheckedCommad
{
get { return new RelayCommand<Object>(x => { PerformUpforTracks(x); }); }
}
void PerformUpforTracks(object x)
{
//TODO
}
我在CheckBox
中使用了ListBox ItemTemplate
。但我未在Checked
中收到CheckBox
的{{1}}事件。
我想从我的ViewModel获取Checked事件。
任何人都有任何想法可以解决这个问题吗?
答案 0 :(得分:2)
ListBox.ItemTemplate的每个实例都自动被赋予“集合中的当前项”作为其DataContext。在您的情况下,这是HistoryCollection中的每个单独项目。在您的示例中,EventTrigger正在您当前的HistoryItem实例中搜索“ThumbsUpCheckedCommad”。
为了强制EventTrigger搜索您想要的ViewModel,您需要指定命令绑定的“Source”属性。我建议使用RelativeSource语法,在树中搜索最后一个Control,将ViewModel作为其DataContext。
它看起来像这样。
{Binding Path=ThumbsUpCheckedCommand, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}
答案 1 :(得分:2)
我通过这种方式绑定Command
Command="{Binding Path=DataContext.UpCheckedCommad,
ElementName=HistoryList}"