2016-04-05 1 views
1

Mon objectif est de formater la couleur d'arrière-plan d'une cellule dans un projet RadGrid dans mon projet WPF pour qu'elle soit celle de la valeur dans les données sous-jacentes. Ces données sont dynamiques, donc je ne peux pas utiliser de modèles prédéfinisWPF: Modification de la liaison dans le modèle dans le code

Il y a des valeurs RVB dans ma table sous-jacente (bien qu'avec des espaces au lieu de virgules donc j'utilise un convertisseur pour corriger cela) et dans un projet de test où j'ai eu un seule colonne « couleur » et modèle, tout fonctionnait un régal:

<Window.Resources> 

    <local:StringToBrushConverter x:Key="lStringToBrushConverter"></local:StringToBrushConverter> 

    <DataTemplate x:Key="ColourCellTemplate"> 
     <Border Name="lBorder" BorderThickness="3" Margin="1" CornerRadius="1" Width="100" 
       BorderBrush="{Binding Colour, Converter={StaticResource lStringToBrushConverter}}"> 
      <TextBlock Background="{Binding ElementName=lBorder, Path=BorderBrush}" ></TextBlock> 
     </Border> 
    </DataTemplate> 

</Window.Resources> 

Le problème est maintenant comment je peux travailler avec ce modèle pour être utilisable dans un scénario dynamique. Essentiellement, tout ce que je dois changer est « Couleur » dans cette partie:

BorderBrush="{Binding Colour, Converter={StaticResource lStringToBrushConverter}}" 

mais je ne sais pas comment cela peut être réalisé dans le code-behind. Je peux utiliser TryFindResource pour obtenir le DataTemplate mais l'étape suivante pour changer la liaison est l'endroit où je suis coincé.

J'ai regardé this exemple de Telerik qui fonctionne dans des circonstances différentes lorsque la valeur est comparée à une autre valeur, mais cela ne résout pas mon problème.

Un grand merci ..

+0

Alors pourquoi CellTemplateSelector n'aide pas? Il permet de sélectionner un modèle basé sur un élément de données, ce qui semble exactement ce dont vous avez besoin. – Evk

+0

Eh bien, je pourrais avoir des centaines de lignes toutes avec une valeur différente et je ne veux pas créer un modèle pour chaque éventualité. Cela fonctionnerait si j'avais, par exemple, juste rouge, bleu, vert ou quelque chose mais les valeurs RVB sont sélectionnées par l'utilisateur en utilisant un sélecteur de couleur. – miriyo

+0

Votre problème n'est pas clair alors. Vous avez des valeurs RVB dans chaque ligne, représentée par la propriété Color. Pourquoi vous ne pouvez pas simplement lier à la couleur que vous décrivez, pourquoi changer de liaison? Ou vous voulez dire que toute la différence est que vous avez 3 colonnes (R, G et B) au lieu d'une? – Evk

Répondre

0

Si je comprends votre problème correctement des commentaires, vous pouvez simplement lier à l'ensemble de l'objet (pas une propriété spécifique, comme la couleur) avec un convertisseur et convertisseur inspecter ses propriétés:

public class ColorColumnsConverter : IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
     if (value == null || value == DependencyProperty.UnsetValue) 
      return null; 
     var folder = value as Folder; // some of your data types 
     if (folder != null) { 
      return folder.ColorProperty; 
     } 
     var jpegFile = value as JpegFile; // some another of your data types 
     if (jpegFile != null) { 
      return jpegFile.Colour; 
     } 
     // etc 
     return null;    
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { 
     throw new NotImplementedException(); 
    } 
} 
+0

Salut, j'ai édité mon modèle juste se lier à l'ensemble DataRow et quand je contrôler la valeur dans mon « RGB convertisseur couleur » quand je le débogage voir la ligne en question. Encore une fois Je n'ai pas tableaux prédéfinis, alors je dois être en mesure de dire le modèle ou le convertisseur le nom de colonne en question à un moment donné. – miriyo

+0

Ah, vous utilisez DataRow, c'est un peu inhabituel de nos jours. Eh bien alors juste inspecter les colonnes de ce DataRow.Table.Columns, trouver ceux dont vous avez besoin, puis extraire les valeurs de votre DataRow. – Evk

+0

J'ai toujours le problème que je ne sais pas quelle colonne utilise le convertisseur. J'ai certainement l'objet DataRow comme valeur mais j'ai besoin d'un moyen de passer le nom du champ via le paramètre – miriyo