Кнопки переключения в ItemsControl привязаны к ObservableCollection

#wpf #itemscontrol #togglebutton

#wpf #itemscontrol #кнопка переключения

Вопрос:

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

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

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

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

Что у меня есть сейчас: то, что у меня есть сейчас, — это itemscontrol в itemscontrol, а внутренний itemscontrol it itemtemplate печатает кнопки переключения, смотрите код ниже:

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

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

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

Редактировать:

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

Дополнительная информация

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

Комментарии:

1. не совсем ясно, какие проблемы у вас с вашим текущим кодом. Кажется, он отображается contact roles правильно. Что касается вашего второго сценария (когда вы что-то снимаете), будет легче понять, чего вы хотите достичь, если вы предоставите пример сценария

Ответ №1:

Как сказал Snowbear, пожалуйста, предоставьте больше входных данных… Из ваших вопросов я вижу…

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

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

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

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

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

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

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

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

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

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

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

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

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