自定义控件使用behaviors绑定事件报错:System.ArgumentException:“Could not find method named ‘***‘ on object of type

原代码:

<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”。

猜你喜欢

转载自blog.csdn.net/wwwwerewrew/article/details/131785822
今日推荐