2010-07-28 20 views
5

Estoy intentando duplicar los botones de la barra de herramientas de alineación izquierda/centro/derecha en Word. Al hacer clic en el botón "Alinear a la izquierda", los botones central y derecho se desmarcarán. Estoy usando un ListBox de WPF con ToggleButtons.Grupo ToggleButton: Asegurar que un elemento siempre esté seleccionado en un ListBox

El problema es que el usuario puede hacer clic dos veces en el botón de Alineación izquierda. El segundo clic hace que el botón se desmarque y establece el valor subyacente a nulo. Me gustaría que el segundo clic no haga nada.

Ideas? ¿Obliga a ListBox a tener siempre un elemento seleccionado? Evite el nulo en el modelo de vista (¿necesita actualizar el enlace 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> 

Respuesta

3

sí, yo preferiría el botón de radio también para este caso, pero si desea utilizar togglebutton entonces tal vez usted puede enlazar la propiedad IsEnabled a IsChecked por lo que no se puede cliked cuando se comprueba

+0

Gracias. En el evento OnClick: if (toggleButton.IsChecked == false) toggleButton.IsChecked = true; –

+0

err realidad estaba pensando más o menos así dnr3

0

En lugar de implementar esto como ToggleButtons, usaría RadioButtons con plantillas personalizadas. Probablemente le ahorrará muchos dolores de cabeza.

+0

El RadioButton tiene otros problemas con el enlace de datos: http://geekswithblogs.net/claraoscura/archive/2008/10/17/125901.aspx. ListBox le permite vincular las opciones posibles en lugar del código. –

+0

RadioButtons tiene otros problemas: no se han desmarcado con un clic, etc ... – ANeves

1

crear un control personalizado de ToggleButton , en el archivo * .xaml.cs, declarar y definir el control

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

en * .xaml, reemplace ToggleButton con mi: ToggleButton2, a continuación, puede unirse a IsNotCheckable IsChecked, al igual que a continuación,

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