ToggleButton组:确保始终在ListBox中选择一个项目

时间:2010-07-28 18:50:02

标签: wpf listbox togglebutton

我正在尝试复制Word中的左/中/右对齐工具栏按钮。单击“左对齐”按钮时,取消选中“中心”和“右”按钮。我正在使用带有ToggleButtons的WPF ListBox。

问题是用户可以单击两次左对齐按钮。第二次单击会导致按钮取消选中并将基础值设置为null。我想第二次点击什么都不做。

想法?强制ListBox始终有一个选定的项目?防止视图模型中的null(需要刷新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 个答案:

答案 0 :(得分:3)

是的,我更喜欢这种情况下的无线电按钮,但是如果你想使用togglebutton,那么也许你可以将isenabled属性绑定到缺陷状态,这样当它被检查时就不能被阻塞了

答案 1 :(得分:2)

从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中,用我的:ToggleButton2替换ToggleButton,然后你可以将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}">           

答案 2 :(得分:1)

我不会将其作为ToggleButtons实现,而是将RadioButtons与自定义模板一起使用。这可能会让你头疼不已。