2010-07-28 12 views
5

Próbuję zduplikować przyciski paska narzędzi wyrównania w lewo/w środku/w prawo w programie Word. Po kliknięciu przycisku "Wyrównanie w lewo" przyciski Środek i Prawo odznaczają. Używam ListBox WPF z ToggleButtons.Grupa ToggleButton: Upewnianie się, że jeden element jest zawsze wybierany w ListBox

Problem polega na tym, że użytkownik może dwukrotnie kliknąć przycisk Wyrównanie do lewej. Drugie kliknięcie powoduje, że przycisk odznacza i ustawia wartość bazową na wartość null. Chciałbym, żeby drugie kliknięcie nie działało.

Pomysły? Zmusić ListBox, aby zawsze miał jeden wybrany element? Zapobieganie wartości zerowej w modelu widoku (należy odświeżyć powiązanie 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> 

Odpowiedz

3

tak, wolałbym RadioButton też w tym przypadku, ale jeśli chcesz używać ToggleButton wtedy może można powiązać IsEnabled właściwość IsChecked więc nie może być cliked kiedy to sprawdzone

+0

Dzięki. W zdarzeniu OnClick: if (toggleButton.IsChecked == false) toggleButton.IsChecked = true; –

+0

Naprawdę myślałem o tym w ten sposób: dnr3

0

Zamiast implementować to jako ToggleButtons, używałbym RadioButtons z niestandardowymi szablonami. To prawdopodobnie zaoszczędziłoby Ci dużo bólu głowy.

+0

RadioButton ma inne problemy z wiązaniem danych: http://geekswithblogs.net/claraoscura/archive/2008/10/17/125901.aspx. ListBox pozwala wiązać możliwe wybory zamiast twardego kodu. –

+0

RadioButtons mają inne problemy: nie są usuwane z kliknięcia, itp ... – ANeves

1

utworzyć formant niestandardowy z ToggleButton , w pliku * .xaml.cs, zadeklarować i zdefiniować kontrolę

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(); 
     } 
    } 
} 

w * .xaml wymienić ToggleButton z moim: ToggleButton2, można wiązać IsNotCheckable do IsChecked, tak jak poniżej,

   <my:ToggleButton2 IsChecked="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" IsNotCheckable="{Binding RelativeSource={RelativeSource Self}, Path=IsChecked, Mode=OneWay}">   
Powiązane problemy