#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 ВСЕ может быть достигнуто с использованием общих шаблонов и стилей. Они определенно устраняют необходимость создания пользовательского элемента управления для различных визуально похожих элементов управления.
НО если ваш элемент управления имеет поведение или функциональность, которые вам нужно выполнять точно так же в нескольких местах, и вы хотите, чтобы он был запечатан и ограничивал себя выполнением этой конкретной функции, тогда создание пользовательского элемента управления имеет смысл.
Поэтому, пожалуйста, перефразируйте свой вопрос и предоставьте более четкие входные данные.