Wpf 切换绑定到ObservableCollection的ItemsControl中的按钮

Wpf 切换绑定到ObservableCollection的ItemsControl中的按钮,wpf,itemscontrol,togglebutton,Wpf,Itemscontrol,Togglebutton,首先我想原谅我的英语 我想要实现的看起来很简单,但在实现过程中我有点迷失了方向 背景:我收集了大量联系人。这些联系人都有一个或多个联系人角色。我将联系人绑定到ItemsControl的itemssource,并希望显示联系人中每个角色的ToggleButton 问题:我的第一个问题是如何从角色联系人列表转到屏幕上的许多切换按钮。我的第二个问题是,如果我单击一个ToggleButton,那么需要检查具有相同联系人的所有其他按钮。如果我单击另一个属于另一个联系人的togglebutton,则需要取消

首先我想原谅我的英语

我想要实现的看起来很简单,但在实现过程中我有点迷失了方向

背景:我收集了大量联系人。这些联系人都有一个或多个联系人角色。我将联系人绑定到ItemsControl的itemssource,并希望显示联系人中每个角色的ToggleButton

问题:我的第一个问题是如何从角色联系人列表转到屏幕上的许多切换按钮。我的第二个问题是,如果我单击一个ToggleButton,那么需要检查具有相同联系人的所有其他按钮。如果我单击另一个属于另一个联系人的togglebutton,则需要取消选中所有选中的按钮,并且需要选中属于新联系人的按钮

我现在拥有什么:我现在拥有的是itemscontrol中的itemscontrol和内部itemscontrol,它的itemstemplate正在打印切换按钮,查看下面的代码:

<Button Content="Add" Width="72" Height="27" Command="{Binding Path=AddContact}" VerticalAlignment="Top"/>
            <ItemsControl ItemsSource="{Binding Path=Contacts}" IsTabStop="False" Name="Parent">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel  />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <ItemsControl ItemsSource="{Binding ContactRoles}">
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <WrapPanel  />
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <ToggleButton Content="{Binding}" CommandParameter="{Binding ElementName=Parent, Path=DataContext.Item}" Template="{StaticResource toggleButtonTemplateButtonBar}"
                                      Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.ViewContact}" Height="27" MinWidth="100">

                                    </ToggleButton>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>

这部分代码正在显示。 我希望有人能帮我

我还有一些问题是,我是否需要创建一个从ItemsControl继承的自定义控件,还是可以通过模板和样式来实现

如果你需要更多信息,请告诉我

谢谢,乔迪

编辑:

很抱歉,我不太清楚我的问题。回到你的评论。第一个ItemsControl的ItemsSource包含具有唯一联系人的列表,第二个ItemsSource包含属于此联系人的字符串(角色)列表。我想为所有联系人的每个角色显示一个切换按钮。但我想你已经从我的代码示例中找到了答案

这张图片将显示我正在尝试做什么。
我希望这能让事情变得更清楚。

正如雪熊所说,请提供更多信息。。。从你的问题中我看到

我的第一个问题是,如何从角色联系人列表中查找联系人 屏幕上有很多切换按钮

你说的“走”是什么意思?您是否在询问如何将
联系人
联系人角色
转换为切换按钮?这就是您的
ItemTemplate
所做的。如果您要求通过切换按钮保留
联系人
对象中的某些属性或数据,那么您已经在
项目模板
中使用了
绑定

        <ToggleButton Content="{Binding}" Tag="{Binding Roles}">
        </ToggleButton>

在上面的示例中,
Tag
是WPF中
FrameworkElement
s的非可视属性之一,它从相应的
Contact
对象绑定到
角色列表

我的第二个问题是,如果我点击一个切换按钮,其他所有的 具有相同触点的按钮也需要检查

你是说在你的
联系人
列表中,一些
联系人
对象被多次添加到列表中?如果是这样,这是一个糟糕的设计,在使用
ItemsSource
时可能会导致错误。如果没有,那么您的声明
所有其他具有**相同联系人**
的按钮都会令人困惑。您的意思是说您的联系人可能会重复,但他们不是同一个对象。它们可能通过某种识别值共享,例如,它们具有相同的
Contact.Name
Contact.ID

如果联系人的某些标识值在不同的联系人对象中是相同的,则您必须智能地使用
SelectedValue
绑定

如果我单击另一个属于另一个联系人的togglebutton all 选中的按钮需要取消选中,并且属于 需要检查新联系人

同样,一旦您决定您真正想要做什么,即您多次添加相同的联系人对象,或者您有不同的
联系人
对象具有一些
公共,这也是可能的

是否需要创建从继承的自定义控件 ItemsControl或者这可以通过模板和样式来完成吗

在WPF中,任何东西都可以使用通用模板和样式实现。它们完全消除了为各种外观相似的控件创建自定义控件的需要

但是,如果控件具有需要在多个位置执行完全相同的行为或功能,并且希望将其密封并限制其自身执行特定功能,则创建自定义控件是有意义的


因此,请重新表述您的问题,并提供更清晰的输入。

目前还不清楚您当前的代码存在哪些问题。它似乎正确地显示了联系人角色。关于第二个场景(当您取消选中某个内容时),如果您提供一个示例场景,则更容易理解您想要实现的目标