2009-10-01 7 views
1

J'ai deux comboboxes avec le même contenu. l'utilisateur ne devrait pas être autorisé à choisir deux fois le même article. donc le contenu des comboboxes (= selectedindex?) ne devrait jamais être égal.WPF/XAML - comparez le "SelectedIndex" de deux comboboxes (DataTrigger?)

ma première tentative était de comapare le selectedIndex avec un DataTrigger pour afficher/cacher un bouton:

<DataTrigger Binding="{Binding ElementName=comboBox1, Path=SelectedIndex}" Value="{Binding ElementName=comboBox2, Path=SelectedIndex}"> 
    <Setter Property="Visibility" Value="Hidden" /> 
</DataTrigger> 

il semble qu'il ne soit pas possible d'utiliser la valeur = {} Liaison. existe-t-il un autre moyen (si possible sans utiliser de convertisseur)? Merci d'avance!

Répondre

3

Option 1

Vous pouvez utiliser ValidationRules - il peut aussi se faire en XAML, et travaillerez pour une situation unique. Ce serait extrêmement localisé et pas quelque chose que je recommanderais puisque la règle ne serait pas réutilisable. Peut-être que quelqu'un d'autre peut proposer une règle générique pour englober différentes entrées. Essayez ceci.

<ComboBox> 
    <ComboBox.SelectedValue> 
     <Binding Path="Whatever" UpdateSourceTrigger="PropertyChanged"> 
      <Binding.ValidationRules> 
       <local:ComparisonValidationRule /> 
      </Binding.ValidationRules> 
     </Binding> 
    </ComboBox.SelectedValue> 
</ComboBox> 

Et le ComparisonRule semble peut-être comme ça, et il devrait être dans le code-behind de cette règle pour voir les contrôles dans l'arborescence visuelle.

public class ComparisonValidationRule : ValidationRule 
{ 
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
    { 
     if (this.firstComboBox.SelectedIndex == this.secondComboBox.SelectedIndex) 
      return new ValidationResult(false, "These two comboboxes must supply different values."); 
     else return new ValidationResult(true, null); 
    } 
} 

OU vous pourriez certainement le faire avec un déclencheur si vous vouliez mettre des choses intéressantes en dehors d'un modèle d'erreur.

Option 2

utiliser un convertisseur de déclenchement &. Ce n'est vraiment pas trop difficile. Voici comment je le ferais.

<Style x:Key="{x:Type ComboBox}" TargetType="{x:Type ComboBox}"> 
    <Style.Triggers> 
     <DataTrigger Value="True"> 
      <DataTrigger.Binding> 
       <MultiBinding Converter="{StaticResource EqualsConverter}"> 
        <Binding ElementName="cbOne" Path="SelectedIndex"/> 
        <Binding ElementName="cbTwo" Path="SelectedIndex"/> 
       </MultiBinding> 
      </DataTrigger.Binding> 
      <Setter Property="Background" Value="Yellow"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

et le convertisseur de code-behind

public class EqualsConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, 
          object parameter, CultureInfo culture) 
    { 
     if (values[0] is int && values[1] is int && values[0] == values[1]) 
      return true; 
     return false; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, 
           object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 
0

Si les ComboBoxes partagent la même ItemSource, définir un indicateur sur l'objet de données sous-jacentes lorsqu'un élément est sélectionné par la première zone de liste déroulante.

Dans le datatemplate pour l'objet de données affiché dans la deuxième zone de liste, écrivez un pointeur de données qui se lie à cette propriété et fait quelque chose de approprié.

Assurez-vous que votre liaison est TwoWay pour le premier ComboBox.

Questions connexes