2011-02-09 12 views
6

Desidero abilitare/disabilitare un ComboBox in base a se è presente un elemento selezionato in un altro ComboBox. Sono riuscito a farlo funzionare impostando un trigger sullo stile, ma questo sostituisce il mio stile globale personalizzato per la casella combinata. C'è un altro modo per ottenere la stessa funzionalità senza perdere il mio stile?Imposta proprietà IsEnabled di ComboBox in base a 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, ho ottenuto questo lavoro con uno stile e preferisco quello al convertitore perché è tutto in XAML. Non avevo bisogno di un setter per specificare che IsEnabled dovrebbe essere true quando il trigger non è attivo. Sto postando questo per gli altri che si imbattono in questa domanda, in modo che non abbiano l'impressione che non può essere fatto con uno stile. – Kohanz

risposta

9

Non è necessario farlo tramite uno stile, è possibile associare la proprietà IsEnabled direttamente utilizzando un convertitore di valore come segue:

<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}"/> 

Dove NullToFalseConverter è una chiave a un'istanza del convertitore 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

Non riesco a ottenere il binding a NullToFalseConverter per funzionare correttamente. Continuo a ricevere un'eccezione: "Impossibile trovare la risorsa denominata 'NullToFalseConverter'. I nomi delle risorse fanno distinzione tra maiuscole e minuscole.". Aiuto? Scusate, sono abbastanza nuovo per WPF: -/ – KrisTrip

+3

@KrisTrip È necessario dichiarare effettivamente un'istanza del convertitore, da qualche parte. Nota che @ColinE lo sta riferendo come un 'StaticResource'. Ciò significa che hai bisogno di una voce nella raccolta Risorse di qualunque cosa contenga il tuo ComboBox che assomigli a questo: '' –

+3

Penso che l'implementazione del Convertitore sia errata, dovrebbe essere e non è richiesto dichiarare un'istanza. Almeno io non ne ho uno e funziona. – steffan

5

Sì, è possibile impostare l'attributo BasedOn a "ereditare" il tuo stile globale:

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

Invece di {StaticResource {x:Type ComboBox}} è possibile impostare la chiave di voi stile globale (se non lo è implicito).

Ma per questa particolare attività non è necessario definire uno stile. Si può solo impostare una proprietà per IsEnabled vincolante e utilizzare un convertitore per convertire elemento selezionato di un'altra casella combinata per un valore booleano:

<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

Come pure funziona così. Ho deciso che l'opzione di conversione era più pulita, quindi l'ho contrassegnata come corretta. – KrisTrip

0

si potrebbe semplicemente avere un "normale "associazione, con un convertitore di valori per la modifica" value exists "=> true," value is null "=> false.