2011-02-09 14 views
6

Quiero habilitar/deshabilitar un ComboBox basado en si hay un elemento seleccionado en otro ComboBox. Pude hacerlo funcionar configurando un disparador en el Estilo, pero eso anula mi estilo global personalizado para el cuadro combinado. ¿Hay alguna otra manera de obtener la misma funcionalidad sin perder mi estilo?Establecer la propiedad IsEnabled de ComboBox basado en SelectedItem

<ComboBox Grid.Column="1" Grid.Row="1" 
       Name="AnalysisComboBox" 
       MinWidth="200" 
       VerticalAlignment="Center" HorizontalAlignment="Left" 
       ItemsSource="{Binding Path=AvailableAnalysis}"> 

     <ComboBox.Style> 
      <Style TargetType="{x:Type ComboBox}"> 
       <Setter Property="IsEnabled" Value="True" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding SelectedItem,ElementName=ApplicationComboBox}" Value="{x:Null}"> 
         <Setter Property="IsEnabled" Value="False" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ComboBox.Style> 
    </ComboBox> 
+0

FWIW, tengo esto trabajando con un estilo y prefiero eso al convertidor porque todo está en XAML. No necesité un setter para especificar que el IsEnabled debería ser verdadero cuando el disparador no está activo. Estoy publicando esto para otros que se encuentran con esta pregunta, para que no tengan la impresión de que no se puede hacer con un estilo. – Kohanz

Respuesta

9

No es necesario hacer esto a través de un estilo, puede enlazar la propiedad IsEnabled directamente mediante un convertidor de valores de la siguiente manera:

<ComboBox Grid.Column="1" Grid.Row="1" 
       Name="AnalysisComboBox" 
       MinWidth="200" 
       VerticalAlignment="Center" HorizontalAlignment="Left" 
       IsEnabled={Binding SelectedItem, ElementName=ApplicationComboBox, Converter={StaticResource NullToFalseConverter}}" 
       ItemsSource="{Binding Path=AvailableAnalysis}"/> 

Dónde NullToFalseConverter es una clave para una instancia del convertidor followsing:

public class NullToFalseConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value == null; 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Parece que no puedo hacer que el enlace a NullToFalseConverter funcione correctamente. Sigo recibiendo una excepción: "No se puede encontrar el recurso llamado 'NullToFalseConverter'. Los nombres de los recursos distinguen entre mayúsculas y minúsculas". ¿Ayuda? Lo siento, soy bastante nuevo en WPF: -/ – KrisTrip

+3

@KrisTrip En realidad, debes declarar una instancia del convertidor. Tenga en cuenta que @ColinE lo está haciendo referencia como 'StaticResource'. Eso significa que necesita una entrada en la colección de recursos de lo que contenga su ComboBox que se parece a esto: '' –

+3

Creo que la implementación del convertidor es incorrecta, debería ser y no es obligatorio, declara una instancia. Al menos no tengo uno y funciona. – steffan

5

Sí, se puede establecer BasedOn atributo de "heredar" su estilo global:

<ComboBox Grid.Column="1" Grid.Row="1" 
      Name="AnalysisComboBox" 
      MinWidth="200" 
      VerticalAlignment="Center" HorizontalAlignment="Left" 
      ItemsSource="{Binding Path=AvailableAnalysis}"> 
    <ComboBox.Style> 
     <Style TargetType="{x:Type ComboBox}" 
       BasedOn="{StaticResource {x:Type ComboBox}}"> 
      <Setter Property="IsEnabled" Value="True" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding SelectedItem,ElementName=ApplicationComboBox}" Value="{x:Null}"> 
        <Setter Property="IsEnabled" Value="False" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ComboBox.Style> 
</ComboBox> 

En lugar de {StaticResource {x:Type ComboBox}} se puede establecer la clave de que estilo global (si no está implícita).

Pero para esta tarea en particular no necesita definir un estilo. Puede acaba de establecer una unión a IsEnabled propiedad y utilizar un convertidor para convertir elemento seleccionado de otro cuadro combinado a un valor lógico:

<ComboBox Grid.Column="1" Grid.Row="1" 
       Name="AnalysisComboBox" 
       MinWidth="200" 
       VerticalAlignment="Center" HorizontalAlignment="Left" 
       ItemsSource="{Binding Path=AvailableAnalysis}" 
      IsEnabled="{Binding SelectedItem,ElementName=ApplicationComboBox, Converter={StaticResource NotNullConverter}"/> 
+0

Vota que esto funciona también. Decidí que la opción del convertidor era más limpia, así que la marqué como correcta. – KrisTrip

0

simplemente podría tener un "normal "vinculante, con un convertidor de valor para cambiar" existe el valor "=> verdadero," valor es nulo "=> falso.

Cuestiones relacionadas