【问题标题】:ToggleButtons in ItemsControl bound to an ObservableCollectionItemsControl 中的 ToggleButtons 绑定到 ObservableCollection
【发布时间】:2011-11-30 18:49:55
【问题描述】:

首先我想原谅我的英语。

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

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

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

我现在有什么:我现在有一个 itemscontrol 中的 itemscontrol,它的 itemtemplate 的内部 itemscontrol 正在打印 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 的自定义控件还是可以通过模板和样式来完成?

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

谢谢,乔迪

编辑:

很抱歉,我没有明确提出我的问题。回来评论你。第一个 ItemsControl 的 ItemsSource 保存一个包含唯一联系人的列表,第二个 ItemsSource 保存一个属于该联系人的字符串(角色)列表。我想为所有联系人的每个角色显示一个 ToggleButton。但我认为你已经从我的代码示例中做了客串。

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

【问题讨论】:

  • 目前的代码有什么问题还不是很清楚。它似乎正确显示contact roles。关于您的第二种情况(当您取消选中某些内容时),如果您提供示例场景,将更容易理解您想要实现的目标

标签: wpf itemscontrol togglebutton


【解决方案1】:

正如雪熊所说,请提供更多输入...从您的问题中我看到...

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

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

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

在上面的示例中,Tag 是 WPF 中 FrameworkElements 的非可视属性之一,从相应的 Contact 对象绑定到 Roles 列表。

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

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

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

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

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

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

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

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

所以请重新表述您的问题并提供更清晰的输入。

【讨论】:

    猜你喜欢
    • 2012-07-04
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2017-02-25
    相关资源
    最近更新 更多