Как получить элементы управления, созданные с помощью DataTemplate? - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть список объектов, которые мне нужно представить в виде списка кнопок. Эти кнопки обычно должны действовать как обычные кнопки; Когда флажок установлен, они должны работать как кнопки ToggleButtons и оставаться нажатыми. Но мне также нужно, чтобы они были взаимоисключающими, как RadioButton (только один может быть переключен в любое время).

Я пытался использовать RadioButton в качестве шаблона для моего ItemsControl, но они не являются взаимоисключающими (я полагаю, что они на самом деле не являются дочерними элементами одного элемента управления).

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

Вот мой XAML:

<Window x:Class="WpfApp9.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">

<UniformGrid Rows="1">
    <UniformGrid.Resources>          
        <DataTemplate x:Key="template">
            <ToggleButton Name="Toggle"                              
                          Checked="ToggleButton_Checked"
                          Content="{Binding}"/>
        </DataTemplate>
    </UniformGrid.Resources>

    <ItemsControl Name="lst" ItemTemplate="{StaticResource template}" />

    <CheckBox Name="CheckToggle"
              HorizontalAlignment="Center"
              VerticalAlignment="Center">
        TOGGLE
    </CheckBox>
</UniformGrid>
</Window>

А это мой код:

using System.Windows;
using System.Windows.Controls.Primitives;

namespace WpfApp9
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            lst.ItemsSource = new[] { "foo", "bar", "baz" };
        }

        private void ToggleButton_Checked(object sender, RoutedEventArgs e)
        {
            var toggle = (ToggleButton)sender;

            // If the checkbox is not checked, release the button immediately
            if (CheckToggle.IsChecked != true)
                toggle.IsChecked = false;

            // now how do I uncheck the other ToggleButtons?
        }
    }
}

1 Ответ

0 голосов
/ 19 ноября 2018

Я решил проблему выше по-другому.В вопросе я сказал, что

Я пытался использовать RadioButton в качестве шаблона для моего ItemsControl, но они не являются взаимоисключающими (я полагаю, что они на самом деле не являются дочерними элементами одного элемента управления)

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

    <DataTemplate x:Key="template">
        <RadioButton Checked="RadioButton_Checked"
                     GroupName="SomeGroupName"
                     Content="{Binding}"/>
    </DataTemplate>

И я получаю свои взаимоисключающие кнопки, не обрабатывая их вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...