2016-04-05 27 views
1

Mein Ziel ist es, die Hintergrundfarbe einer Zelle in einem RadGridView in meinem WPF-Projekt als der Wert in den zugrunde liegenden Daten zu formatieren. Diese Daten sind jedoch dynamisch, so dass ich keine vordefinierten Vorlagen verwenden kann.WPF: Ändern der Bindung in Vorlage in Code hinter

Es gibt RGB-Werte in meiner zugrunde liegenden Tabelle (allerdings mit Leerzeichen anstelle von Kommas, also benutze ich einen Konverter, um das zu beheben) und in einem Testprojekt, wo ich hatte einzelne Spalte „Farbe“ und Vorlage, funktionierte alles ein Genuss:

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

Das Problem ist jetzt, wie ich mit dieser Vorlage arbeiten in einem dynamischen Szenario verwendbar zu sein. Im Grunde alles, was ich ändern muß, ist „Farbe“ in diesem Teil:

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

aber ich bin nicht sicher, wie das in Code-behind erreicht werden kann. Ich kann TryFindResource verwenden, um das DataTemplate zu erhalten, aber der nächste Schritt zum Ändern der Bindung ist, wo ich feststecke.

Ich habe this Beispiel von Telerik geschaut, die unter verschiedenen Umständen funktioniert, wenn der Wert mit einem anderen Wert verglichen wird, aber es löst nicht mein Problem.

Vielen Dank ..

+0

Warum also CellTemplateSelector nicht helfen? Es ermöglicht die Auswahl einer Vorlage basierend auf einem Datenelement, das genau das zu sein scheint, was Sie brauchen. – Evk

+0

Nun, ich könnte Hunderte von Zeilen haben alle mit einem anderen Wert und ich möchte keine Vorlage für jede Eventualität erstellen. Das würde funktionieren, wenn ich z.B. nur rot, blau, grün oder etwas, aber die RGB-Werte werden vom Benutzer mit einem Farbwähler ausgewählt. – miriyo

+0

Ihr Problem ist dann nicht klar. Sie haben in jeder Zeile RGB-Werte, die durch die Color-Eigenschaft dargestellt werden. Warum können Sie nicht einfach an Farbe binden, wie Sie beschreiben, warum die Bindung ändern? Oder meinst du den ganzen Unterschied, dass du 3 Spalten (R, G und B) anstelle von einem hast? – Evk

Antwort

0

Wenn ich Ihr Problem richtig von den Kommentaren zu verstehen, können Sie einfach binden an das gesamte Objekt (nicht zu irgendeiner bestimmten Eigenschaft, wie Farbe) mit einem Konverter und Konverter inspizieren es Eigenschaften sind:

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

Hallo, Ich habe meine Vorlage bearbeitet, um nur an die gesamte DataRow zu binden, und wenn ich den Wert in meinem "RGB zu Farbkonverter" beim Debuggen überprüfe, sehe ich die fragliche Zeile. Wieder habe ich keine vordefinierten Tabellen, daher muss ich in der Lage sein, dem Template oder dem Konverter den fraglichen Spaltennamen zu sagen. – miriyo

+0

Ah, Sie benutzen DataRow, das ist heutzutage etwas ungewöhnlich. Prüfen Sie dann einfach die Spalten dieser DataRow.Table.Columns, suchen Sie die benötigten Daten und extrahieren Sie die Werte aus Ihrer DataRow. – Evk

+0

Ich habe immer noch das Problem, dass ich nicht weiß, welche Spalte den Konverter verwendet. Ich habe sicherlich das DataRow-Objekt als Wert, aber ich brauche eine Möglichkeit, den Feldnamen über den Parameter – miriyo