原代码:
<ItemsControl ItemsSource="{Binding jkDeviceItems}">
<ItemsControl.ItemsPanel >
<ItemsPanelTemplate>
<UniformGrid Columns="6" Margin="0" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<loc:CommunicationPanel TerminalNO="{Binding TerminalNO}" Location="{Binding Location}" Status="{Binding Status}" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked">
<i:CallMethodAction MethodName="CustomCheckBox_Checked" TargetObject="{Binding}"/>
</i:EventTrigger>
<i:EventTrigger EventName="UnChecked">
<i:CallMethodAction MethodName="CustomCheckBox_UnChecked" TargetObject="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</loc:CommunicationPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
报错原因:我们的事件“CustomCheckBox_Checked”是写在对应的ViewModel中,因为ItemsControl控件写了【ItemsSource="{Binding jkDeviceItems}"】,那么【TargetObject="{Binding}"】意思就是在jkDeviceItems中去找“CustomCheckBox_Checked”,找不到所以报错。
修改后:
<ItemsControl ItemsSource="{Binding jkDeviceItems}">
<ItemsControl.ItemsPanel >
<ItemsPanelTemplate>
<UniformGrid Columns="6" Margin="0" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<loc:CommunicationPanel TerminalNO="{Binding TerminalNO}" Location="{Binding Location}" Status="{Binding Status}" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked">
<i:CallMethodAction MethodName="CustomCheckBox_Checked" TargetObject="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
</i:EventTrigger>
<i:EventTrigger EventName="UnChecked">
<i:CallMethodAction MethodName="CustomCheckBox_UnChecked" TargetObject="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</loc:CommunicationPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
绑定事件将【TargetObject="{Binding}"】改成了【 TargetObject="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}】,意思是找到最近的类型为ItemsControl的祖先元素,并获取其DataContext作为绑定的目标对象,这样就能找到事件“CustomCheckBox_Checked”。