views:

137

answers:

2

I am trying to duplicate the left/center/right alignment toolbar buttons in Word. When you click the "Left Alignment" button the Center and Right buttons uncheck. I am using a WPF ListBox with ToggleButtons.

The problem is the user can click the Left Alignment button twice. The second click causes the button to uncheck and sets the underlying value to null. I'd like the second click to do nothing.

Ideas? Force the ListBox to always have one selected item? Prevent the null in the view model (need to refresh the ToggleButton binding)?

    <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>
A: 

Rather than implementing this as ToggleButtons, I would use RadioButtons with custom templates. It would probably save you a lot of headache.

FMM
The RadioButton has other problems with data binding: http://geekswithblogs.net/claraoscura/archive/2008/10/17/125901.aspx. The ListBox lets you bind the possible choices rather than hard code.
Brian
A: 

yeah, i would prefer the radiobutton too for this case, but if you want to use togglebutton then maybe you can bind the isenabled property to ischecked so it cannot be cliked when it's checked

dnr3
Thanks. In the OnClick event: if (toggleButton.IsChecked == false) toggleButton.IsChecked = true;
Brian
err actually i was thinking more about like this <ToggleButton IsChecked="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" IsEnabled="{Binding Converter={StaticResource boolConverter},RelativeSource={x:Static RelativeSource.Self},Path=IsChecked}"> <TextBlock Text="{Binding Description}" /> </ToggleButton>
dnr3