ListBox со встроенным CheckBox, ограничивающим один проверяемый элемент - PullRequest
0 голосов
/ 19 сентября 2011

У меня есть ListBox, содержащий ItemTemplate, состоящий из StackPanel, содержащий CheckBox и Label.Я хочу разрешить проверять только один элемент списка одновременно.У меня проблемы с пониманием, как я могу добиться этого.Вот XAML, описывающий список:

<ListBox Grid.Row="0"
         Grid.Column="0"
         Width="180"
         HorizontalAlignment="Left"
         x:Name="listboxPlayers"
         ItemsSource="{Binding Players}"
         SelectedItem="{Binding SelectedPlayer, Mode=TwoWay}"
         ScrollViewer.VerticalScrollBarVisibility="Visible">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding IsDefault, Mode=TwoWay}"
                          VerticalAlignment="Center"
                          Checked="CheckBox_Checked"
                          Unchecked="CheckBox_Unchecked"/>
                <Label Content="{Binding Name}"
                       VerticalAlignment="Center" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Игрок определен так:

public class Player
{
    public string Name { get; set; }
    public bool IsDefault { get; set; }
}

Мой список Players определен так:

public ObservableCollection<Player> Players { get; private set; }

Мой SelectedPlayer определяется следующим образом:

public static readonly DependencyProperty SelectedPlayerProperty =
    DependencyProperty.Register("SelectedPlayer", typeof(Player), typeof(MainWindow),
        new FrameworkPropertyMetadata());

public Player SelectedPlayer
{
    get { return (Player)GetValue(SelectedPlayerProperty); }
    set { SetValue(SelectedPlayerProperty, value); }
}

Мне не удалось найти сообщение или вопрос, которые могут мне помочь.Я играл с использованием обработчика событий Checked для CheckBox, но я не могу понять, как связать список с правильным Player в списке, потому что ListBox не корректирует SelectedPlayerкогда флажок установлен или снят.

Большое спасибо.

Ответы [ 3 ]

1 голос
/ 20 сентября 2011

Я обычно использую следующий стиль для отображения ListBox с помощью CheckBoxes (Вы также можете использовать RadioButtons, просто заменив элемент управления CheckBox на RadioButton

<Style x:Key="CheckBoxListBoxStyle" TargetType="{x:Type ListBox}">
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="KeyboardNavigation.DirectionalNavigation" Value="Cycle" />
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="{x:Type ListBoxItem}" >
                <Setter Property="Margin" Value="2, 2, 2, 0" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Border Background="Transparent">
                                <CheckBox IsHitTestVisible="False" Focusable="false" 
                                    Content="{TemplateBinding ContentPresenter.Content}"  
                                    IsChecked="{Binding Path=IsSelected,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay}"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Setter.Value>
    </Setter>
</Style>

Тогда он просто используется чем-то вроде

<ListBox ItemsSource="{Binding Players}"
         Style="{StaticResource CheckBoxListBoxStyle}"
         SelectedItem="{Binding SelectedPlayer, Mode=TwoWay}">
0 голосов
/ 19 сентября 2011

Если у вас есть что-то, что должно вести себя как RadioButton, почему бы не использовать RadioButton?

0 голосов
/ 19 сентября 2011

Попробуйте настроить ListBox для режима выбора Single. И вместо отдельной метки вы можете просто связать Name со свойством Content CheckBox. Мне нравится, как пространства. И вам может понадобиться реализовать InotifyPropertyChanged на плеере.

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