2010-07-26 5 views
0

Voici mon problème actuel:Comment créer des colonnes mutuellement exclusives dans une grille de données WPF?

J'ai une grille de données avec 4 colonnes: la première année par indice, la première année par pourcentage, la deuxième année + par indice et la deuxième année + par pourcentage. Je veux que ma grille de données rende ces colonnes mutuellement exclusives avec sa colonne homologue. Donc, par exemple, si je tape un nombre pour la première année en pourcentage, je ne devrais pas être autorisé à entrer quoi que ce soit pour la première année par indice et vice versa. Il en va de même avec les colonnes de l'année deux + les unes avec les autres. Je serais assez heureux si au lieu de verrouiller la colonne il effacerait la valeur de l'autre colonne (c.-à-d. Dans l'exemple ci-dessus, au lieu de ne pas pouvoir éditer la première année par Index, fais que si tu l'as fait effacera la valeur de la première année en pourcentage).

Des idées?

EDIT: Voici ce que j'ai essayé jusqu'à présent: je tenté d'ajuster le champ « AllowEdit » de la colonne voisine quand quelque chose devient changement (cela ne fait rien), et j'ai essayé effacer la valeur dans l'autre colonne (a également échoué).

+0

Lorsqu'une valeur de cellule change, recherchez la colonne parente puis vide et/ou désactivez la colonne "complémentaire". – ChrisF

Répondre

1

Si vous utilisez une sorte de modèle MVVM alors dans votre viewmodel qui représente les données pour une ligne, vous pouvez faire quelque chose comme ceci:

public const string YearOneByIndexPropertyName = "YearOneByIndex"; 
public int YearOneByIndex 
{ 
    get 
    { 
     return _yearOneByIndex; 
    } 

    set 
    { 
     if (_yearOneByIndex == value) 
     { 
      return; 
     } 

     _yearOneByIndex = value; 
     _yearOneByPercentage = 0 

     RaisePropertyChanged(YearOneByIndexPropertyName); 
     RaisePropertyChanged(YearOneByPercentagePropertyName); 
    } 
} 

public const string YearOneByPercentagePropertyName = "YearOneByPercentage"; 
public int YearOneByPercentage 
{ 
    get 
    { 
     return _yearOneByPercentage; 
    } 

    set 
    { 
     if (_yearOneByPercentage == value) 
     { 
      return; 
     } 

     _yearOneByPercentage = value; 
     _yearOneByIndex = 0; 

     RaisePropertyChanged(YearOneByIndexPropertyName); 
     RaisePropertyChanged(YearOneByPercentagePropertyName); 
    } 
} 

Edit: Vous pouvez également ajouter des propriétés booléennes à lier aux propriétés IsReadOnly de chaque colonne et utilisez la même technique pour définir l'une de la colonne alternative sur true.

Éditer: Avec quelques tests, j'ai trouvé que vous devez définir la liaison de la colonne de la grille de données UpdateSourceTrigger à PropertyChanged. Sinon, le code de configuration décrit ci-dessus ne fonctionnera pas tant que l'utilisateur n'aura pas appuyé sur la touche Entrée ou sélectionné une autre ligne. PS: J'utilise MVVM-Light qui est l'origine de RaisePropertyChanged.

Questions connexes