Группа ToggleButton: обеспечение того, чтобы в ListBox всегда был выбран один элемент - PullRequest
5 голосов
/ 28 июля 2010

Я пытаюсь дублировать кнопки панели инструментов выравнивания влево / по центру / справа в Word.Когда вы нажимаете кнопку «Выравнивание по левому краю», снимите отметку с центральной и правой кнопок.Я использую WPF ListBox с ToggleButtons.

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

Идеи?Заставить ListBox всегда иметь один выбранный элемент?Предотвратить нулевое значение в модели представления (необходимо обновить привязку ToggleButton)?

    <ListBox ItemsSource="{x:Static domain:FieldAlignment.All}" SelectedValue="{Binding Focused.FieldAlignment}">
      <ListBox.ItemTemplate>
        <DataTemplate>
          <ToggleButton IsChecked="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}">
            <TextBlock Text="{Binding Description}" />
          </ToggleButton>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>

Ответы [ 3 ]

3 голосов
/ 29 июля 2010

да, я бы предпочел и радио кнопку для этого случая, но если вы хотите использовать кнопку переключения, то, возможно, вы можете привязать свойство isenabled к ischecked, чтобы его нельзя было кликнуть при проверке

2 голосов
/ 07 августа 2011

создать пользовательский элемент управления из ToggleButton, в файле * .xaml.cs объявить и определить элемент управления

    public class ToggleButton2 : ToggleButton
{
    public bool IsNotCheckable
    {
        get { return (bool)GetValue(IsNotCheckableProperty); }
        set { SetValue(IsNotCheckableProperty, value); }
    }

    // Using a DependencyProperty as the backing store for IsNotCheckable.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsNotCheckableProperty =
        DependencyProperty.Register("IsNotCheckable", typeof(bool), typeof(ToggleButton2), new FrameworkPropertyMetadata((object)false));

    protected override void OnToggle()
    {
        if(!IsNotCheckable)
        {
            base.OnToggle();
        }
    }
}

в * .xaml, замените ToggleButton на my: ToggleButton2, затем вы можете привязать IsNotCheckable к IsChecked, как показано ниже,

              <my:ToggleButton2 IsChecked="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}"  IsNotCheckable="{Binding RelativeSource={RelativeSource Self}, Path=IsChecked, Mode=OneWay}">           
1 голос
/ 28 июля 2010

Вместо того, чтобы реализовывать это как ToggleButtons, я бы использовал RadioButtons с пользовательскими шаблонами.Это, вероятно, избавит вас от головной боли.

...