ItemsControl中的ToggleButtons绑定到ObservableCollection

时间:2011-10-04 14:59:58

标签: wpf itemscontrol togglebutton

首先,我想原谅我的英语。

我想要实现的目标看起来很简单,但我在实现中有点迷失。

后台:我有一个ObservableCollection的联系人。这些联系人都有一个或多个ContactRoles。我将联系人绑定到ItemsControl的itemssource,并希望显示联系人中每个角色的ToggleButton。

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

我现在拥有什么:我现在拥有的是itemscontrol中的itemscontrol和内部itemscontrol它的itemtemplate正在打印ToggleButtons看下面的代码:

<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的自定义控件,还是可以通过模板和样式来完成?

我需要更多信息让我知道。

谢谢,Jordy

编辑:

对不起,我在提出问题时并不是那么清楚。回过头来评论。第一个ItemsControl的ItemsSource包含具有唯一联系人的列表,第二个ItemsSource包含属于此联系人的字符串(角色)列表。我想为所有联系人的每个角色显示一个ToggleButton。但我认为你已经从我的代码示例中猜到了这一点。

Some more information

此图片将显示我正在尝试做的事情。 我希望这会使事情更清楚。

1 个答案:

答案 0 :(得分:0)

正如Snowbear所说,请提供更多意见......从你的问题我看到......

  

我的第一个问题是如何从具有角色的联系人列表中查找   很多ToggleButtons在屏幕上。

GO 是什么意思?您是否在询问ContactsContact.Roles如何转换为ToggleButtons?那就是你ItemTemplate正在做的事情。如果您要求通过切换按钮保留Contact对象中的某些属性或数据,那么您已在Binding中使用了ItemTemplate

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

在上面的示例中,Tag是WPF中FrameworkElement的非可视属性之一,被绑定到相应Roles的{​​{1}}列表中对象。

  

我的第二个问题是如果我点击一个ToggleButton所有其他   具有相同联系人的按钮也需要进行检查。

您是说在Contact列表中多次添加了ContactsContact对象?如果是这样,这是一个糟糕的设计,可能会在使用ItemsSource时导致失误。如果不是,那么您的all other buttons that have the **same contact**声明令人困惑。您是说您的联系人可能会重复,但它们不是同一个对象通过引用。可能他们分享一些识别价值,例如他们有相同的Contact.NameContact.ID等。

如果某些联系人的识别值在不同的联系人对象之间是相同的,那么您将必须智能地使用SelectedValue绑定。

  

如果我点击另一个属于另一个联系人的togglebutton全部   选中的按钮需要取消选中,按钮属于   需要检查新的联系方式。

一旦你决定你真正想要做什么,即你是多次添加相同的联系人对象,或者你有不同的Contact个对象有一些value共同点,这是可能的。

  

我是否需要制作继承自的自定义控件   ItemsControl还是可以通过模板和样式来完成?

在WPF中,使用通用模板和样式可以实现任何目的。它们绝对不需要为各种视觉上相似的控件创建自定义控件。

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

请重新提出您的问题并提供更清晰的输入。