2011-02-09 16 views
6

Chcę włączyć/wyłączyć ComboBox na podstawie, jeśli istnieje element wybrany w innym ComboBox. Udało mi się uruchomić go poprzez ustawienie wyzwalacza w stylu, ale to nadpisuje mój niestandardowy styl globalny dla combobox. Czy istnieje inny sposób na uzyskanie tej samej funkcjonalności bez utraty stylu?Zestaw właściwości IsEnabled ComboBox na podstawie 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, Mam to działa ze stylem i wolę to do konwertera, ponieważ wszystko jest w XAML. Nie potrzebowałem ustawiacza, aby określić, że IsEnabled powinien być prawdziwy, gdy wyzwalacz nie jest aktywny. Publikuję to dla innych, którzy natrafiają na to pytanie, aby nie mieli wrażenia, że ​​nie można tego zrobić przy użyciu stylu. – Kohanz

Odpowiedz

9

Nie trzeba to zrobić za pomocą stylów, można powiązać właściwość IsEnabled bezpośrednio za pomocą konwertera wartości następująco:

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

Gdzie NullToFalseConverter jest kluczem do instancji konwertera 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

Nie mogę uzyskać powiązania z NullToFalseConverter, aby działał poprawnie. Wciąż otrzymuję wyjątek: "Nie można znaleźć zasobu o nazwie" NullToFalseConverter ". W nazwach zasobów rozróżniana jest wielkość liter.". Wsparcie? Przepraszam, jestem całkiem nowy w WPF: -/ – KrisTrip

+3

@KrisTrip Musisz faktycznie zadeklarować gdzieś Konwerter. Zauważ, że @ColinE odwołuje się do niego jako 'StaticResource'. Oznacza to, że potrzebny jest wpis w kolekcji Zasoby dowolnego elementu ComboBox, który wygląda mniej więcej tak: '' –

+3

Myślę, że implementacja Konwertera jest niepoprawna, powinna to być i nie jest wymagane zadeklaruj instancję. Przynajmniej nie mam takiego i działa. – steffan

5

Tak, można ustawić atrybut BasedOn do „dziedziczenia” swój styl globalny:

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

Zamiast {StaticResource {x:Type ComboBox}} można ustawić klawisz z was globalnego stylu (jeśli nie jest niejawna).

Ale do tego konkretnego zadania nie trzeba definiować stylu. można po prostu ustawić właściwość wiązania się IsEnabled i użyć konwertera do konwersji wybranego elementu innego pola kombi do wartości logicznej:

<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

Awans, ponieważ to również działa. Zdecydowałem, że opcja konwertera jest czystsza, więc oznaczyłem ją jako poprawną. – KrisTrip

0

Mogłeś po prostu mieć „normalny "binding, z konwerterem wartości do zmiany" value exists "=> true," value is null "=> false.

Powiązane problemy