Кнопки ToggleButtons в ItemsControl, привязанные к коллекции ObservableCollection - PullRequest
3 голосов
/ 04 октября 2011

Прежде всего я хочу извинить за свой английский.

То, чего я хочу достичь, выглядит очень просто, но я немного потерян в реализации.

Фон: У меня есть наблюдаемая коллекция контактов. все эти контакты имеют 1 или более контактных ролей. Я связываю контакты с источником элементов ItemControl и хочу, чтобы для каждой роли в контакте отображалась кнопка ToggleButton.

Вопрос: Мой первый вопрос: как мне перейти от списка контактов с ролями к большому количеству кнопок-переключателей на экране. Второй вопрос, который у меня возникает, - если я нажимаю одну кнопку ToggleButton, необходимо проверить и все остальные кнопки, которые имеют такой же контакт. Если я щелкаю по другой кнопке переключения, которая принадлежит другому контакту, все отмеченные кнопки должны быть сняты, а кнопки, принадлежащие новому контакту, должны быть проверены.

Что у меня сейчас есть: Теперь у меня есть элемент управления в элементе управления и внутренний элемент управления, который печатает шаблон элемента. Кнопки Toggle выглядят следующим кодом:

<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, или это можно сделать с помощью шаблонов и стилей?

Если вам нужна дополнительная информация, дайте мне знать.

Спасибо, Джорди

EDIT:

Извините, я не очень ясно сформулировал свои вопросы. вернуться на ваш комментарий. ItemsSource первого ItemsControl содержит список с уникальными контактами, а ItemsSource второго содержит список строк (ролей), принадлежащих этому контакту. Я хочу показать ToggleButton для каждой роли всех контактов. Но я думаю, что вы догадались об этом из моего примера кода.

Some more information

Это изображение покажет, что я пытаюсь сделать. Надеюсь, это прояснит ситуацию.

1 Ответ

0 голосов
/ 05 октября 2011

Как сказал Snowbear, предоставьте больше информации ... Из ваших вопросов я вижу ...

Мой первый вопрос: как мне перейти от списка контактов с ролями к множеству кнопок ToggleButton?на экране.

Что вы подразумеваете под GO ?Вы спрашиваете, как Contacts или Contact.Roles преобразуются в ToggleButtons?Тогда это то, что делает ваш ItemTemplate.Если вы спрашиваете, хотите ли вы, чтобы какое-либо свойство или данные объекта Contact удерживались кнопкой переключения, то вы уже использовали Binding в вашем ItemTemplate.

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

В приведенном выше примереTag, являющееся одним из невизуальных свойств FrameworkElement s в WPF, связано со списком Roles из соответствующего объекта Contact.

Второй вопрос, который у меня возникает, - если я нажимаю одну кнопку ToggleButton, необходимо проверить и все остальные кнопки, имеющие тот же контакт .

Вы говорите, что в вашем списке Contacts какой-то Contact объект добавляется несколько раз в список?Если это так, то это плохой дизайн и может привести к ошибкам при использовании ItemsSource.Если нет, то это ваше утверждение all other buttons that have the **same contact** сбивает с толку.Вы имеете в виду, что у вас есть Контакты, которые могут повторяться, но это не один и тот же объект по ссылке .Возможно, они имеют какое-то идентифицирующее значение, например, они имеют одинаковые Contact.Name или Contact.ID и т. Д.

Если какое-то идентифицирующее значение контакта одинаково для разных контактных объектов, вам придется разумно использовать SelectedValue обязательный.

Если я нажимаю другую тумблер, принадлежащий другому контакту, все отмеченные кнопки должны быть сняты, а кнопки, принадлежащие новому контакту, должны быть проверены.

Снова этовозможно, если вы решите, что вы на самом деле пытаетесь сделать, то есть добавляете ли вы один и тот же объект контакта несколько раз или у вас есть разные Contact объекты, имеющие value общего.

Нужно лиПользовательский элемент управления, который наследуется от ItemsControl или это может быть сделано с помощью шаблонов и стилей?

в WPF, НИЧЕГО можно достичь с помощью общих шаблонов и стилей.Они определенно устраняют необходимость создания настраиваемого элемента управления для различных визуально похожих элементов управления.

НО, если у вашего элемента управления есть поведение или функциональность, которые вам нужно выполнять точно так же в нескольких местах, и вы хотите, чтобы он был запечатан и ограничивал себя при выполнении этой конкретной функции, тогда создание пользовательского элемента управления имеет смысл.

Поэтому, пожалуйста, перефразируйте свой вопрос и предоставьте более четкие данные.

...