2016-11-29 2 views
1

DataGrid.ItemSource wird in Code hinter einem dataview gesetzt. Spaltennamen und -anzahl müssen sich im laufenden Betrieb ändern, daher funktioniert eine Liste von Objekten nicht sehr gut.Konverter erhält eine DataRowView anstelle von DataGridCell

Ich habe das Tabellen-Display funktioniert vollständig korrekt. Was toll ist, , aber mein GridCellStyle übergibt das DataRowView an den Konverter anstelle des DataGridCell, was ich erwartet habe, zu übergeben.

Gibt es eine Möglichkeit, entweder den DataGridCell-Inhalt ODER etwas zu bekommen, das angibt, welche Spalte aktuell an meinen Konverter übergeben wird?

<UserControl x:Class="TestUI.SilveusTable" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:TestUI" 
      mc:Ignorable="d" 
      > 
    <UserControl.Resources> 
     <local:CbotValueConverter x:Key="CbotValueConverter" /> 
     <Style x:Key="GridCellStyle" TargetType="{x:Type DataGridCell}"> 
      <Setter Property="Background" Value="Yellow"/> 
      <Setter Property="Foreground" Value="{Binding Converter={StaticResource CbotValueConverter}}"/> 
     </Style> 
    </UserControl.Resources> 
    <Grid> 
     <DataGrid x:Name="DataGrid1" IsReadOnly="True" CellStyle="{StaticResource GridCellStyle}" /> 
    </Grid> 
</UserControl> 

Hier ist meine Converter Klasse

[ValueConversion(typeof(DataGridCell), typeof(SolidColorBrush))] 
    public class CbotValueConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      var dgc = (DataGridCell) value; 
      var rowView = (DataRowView) dgc.DataContext; 
      var v = rowView.Row.ItemArray[dgc.Column.DisplayIndex]; 

      decimal amount; 
      if (decimal.TryParse(v.ToString(), out amount)) 
      { 
       if (amount >= 10) return Brushes.Red; 
       if (amount >= 5) return Brushes.Blue; 
       if (amount > 0) return Brushes.Green; 
      } 

      return Brushes.Black; //quantity should not be below 0 
     } 

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

"was ich erwartet hatte, zu übergeben." Das ist eine falsche Erwartung. Wenn Sie nicht explizit eine Bindungsquelle (nach Quelle, RelativeSource oder ElementName) festlegen, verwendet eine Bindung den aktuellen DataContext als Quelle. Hier ist es das aktuelle Element aus der Items- oder ItemsSource-Auflistung. – Clemens

+0

Vorausgesetzt, dass der Stil an ein * DataGridCell * gebunden ist und das Tag * CellStyle * ist, ist die Erwartung, dass es genau das passieren würde, an das es gebunden ist, eine sehr vernünftige Erwartung. Wie sonst werden Sie eine Konvertierung basierend auf dem Inhalt einer Zelle durchführen? –

+0

Ein Style ist an nichts gebunden. Eigenschaften in Style Settern können an Eigenschaften des aktuellen DataContext gebunden werden, es sei denn, die Binding gibt explizit eine andere Quelle an. Außerdem ist der Inhalt einer Zelle keine DataGridCell. Siehe hier: [Data Templating Overview] (https://msdn.microsoft.com/en-us/library/ms742521 (v = vs.110) .aspx). – Clemens

Antwort

2

Änderung der Quelle eines Bindungs ​​

mit currect verbindliche Erklärung, Datacontext von Datagridcell die Quelle ist

Value="{Binding Converter={StaticResource CbotValueConverter}}" 

Datagridcell zu verwenden selbst hinzufügen RelativeSource Self Teil (bezieht sich auf das Element, auf dem Sie setzen die Bindung)

Value="{Binding Converter={StaticResource CbotValueConverter}, 
       RelativeSource={RelativeSource Self}}" 
Verwandte Themen