2012-01-27 2 views
2

J'ai une liste déroulante, et je veux qu'elle soit activée lorsque la case n'est pas cochée. Comment est-ce que je l'écris? J'ai essayé la suite, mais il semble que WPF ne reconnaît pas cette syntaxe:formules dans les liaisons WPF

<ComboBox IsEnabled={Binding Path=!CheckBoxIsChecked, Mode=OneWay}/> 
<CheckBox IsChecked={Binding Path=CheckBoxIsChecked}/> 
+1

je crois approche plus générique serait d'introduire InverseBooleanConverter ([voir ici] (http://stackoverflow.com/a/1039681/485076)) et l'utiliser où vous avez besoin au lieu de copier-coller sur plusieurs vues – sll

+0

duplication possible de [Comment lier inverser les propriétés booléennes dans WPF?] (Http://stackoverflow.com/questions/1039636/how -to-bind-inverse-boolean-properties-in-wpf) – sll

Répondre

-1

Un déclencheur devrait fonctionner aussi bien pour cela:

<CheckBox IsChecked="{Binding Path=CheckBoxIsChecked}" /> 
    <ComboBox Grid.Row="1" ItemsSource="{Binding Path=ComboItems}" SelectedItem="{Binding Path=SelectedItem, Mode=TwoWay}"> 
     <ComboBox.Style> 
      <Style TargetType="ComboBox"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=CheckBoxIsChecked}" Value="False" > 
         <Setter Property="IsEnabled" Value="True"/> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Path=CheckBoxIsChecked}" Value="True" > 
         <Setter Property="IsEnabled" Value="False"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ComboBox.Style> 
    </ComboBox> 
+0

Ne préférerait pas cette solution comme déjà mentionné. C'est beaucoup plus de code et moins maintenable sur plusieurs éditeurs dans plusieurs endroits de l'application. –

1

Vous devrez écrire un convertisseur, à savoir une classe qui implémente l'interface IValueConverter. Le convertisseur sera alors affecté à la propriété de votre convertisseur de liaison:

<ComboBox IsEnabled="{Binding Path=CheckBoxIsChecked, Mode=OneWay, Converter={StaticResource MyConverter}}"/> 
+0

Il est plus facile d'écrire une propriété CheckBoxIsNotChecked {get {return! CheckBoxIsChecked; }} –

+1

Oui, mais que se passe-t-il si vous vous liez à un objet que vous n'écrivez pas vous-même, c'est-à-dire où vous n'avez aucun contrôle sur l'ensemble des propriétés? – Clemens

+0

c'est un bon point –

1

Vous devez utiliser des convertisseurs soi-disant de faire ce genre de choses.

BoolToVisibilityConverter est un convertisseur WPF standard. Vous pouvez également écrire facilement un OppositeBoolToVisibilityConverter. De nombreux exemples sur le net.

1

Pour cela, vous devrez utiliser un convertisseur.

public class BooleanNegationConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ConvertValue(value); 
    } 
    private bool ConvertValue(object value) 
    { 
     bool boolValue; 
     if(!Boolean.TryParse(value.ToString(), out boolValue)) 
     { 
      throw new ArgumentException("Value that was being converted was not a Boolean", "value"); 
     } 
     return !boolValue; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ConvertValue(value); 
    } 
} 

ensuite l'utiliser comme ceci:

<ComboBox IsEnabled="{Binding Path=CheckBoxIsChecked, 
           Mode=OneWay, 
           Converter={StaticResource BooleanNegationConverterKey}}"/> 

Rappelez-vous que vous devez déclarer cette ressource statique dans les ressources XAML. Comme ceci:

<UserControl.Resources> 
    <ResourceDictionary> 
     <BooleanNegationConverter x:Key="BooleanNegationConverterKey" /> 
    </ResourceDictionary> 
</UserControl.Resources> 
Questions connexes