2017-04-07 67 views
1

我有一個包含日期和值(溫度)列表的數據網格。如果溫度太高或太低,我有一個valueconverter對象,用於爲每行的背景着色。此代碼工作正常:如何在運行時在Converter對象上設置屬性

XAML:

<Style x:Key="GraphTableDataRowStyle" TargetType="{x:Type DataGridRow}"> 
    <Setter Property="Background" Value="{Binding Value, Converter={StaticResource DatagridAlarmConverter}}"/> 
</Style> 

C#:轉換器

public class DatagridAlarmConverter : IValueConverter 
{ 
    public double? HiAlarm = null; 
    public double? LoAlarm = 20; 
    public Brush HiAlarmColor = Brushes.Red; 
    public Brush LoAlarmColor = Brushes.Blue; 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     double? input = value as double?; 

     if (input != null) 
     { 
      if (HiAlarm != null) 
      { 
       if (input > HiAlarm) 
       { 
        return HiAlarmColor; 
       } 
      } 
      if (LoAlarm != null) 
      { 
       if (input < LoAlarm) 
       { 
        return LoAlarmColor; 
       } 
      } 
     } 
     return DependencyProperty.UnsetValue; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

C#:Datagrid的創作

... 
DataGrid dGrid = new DataGrid(); 
dGrid.Style = FindResource("GraphTableDataGridStyle") as Style; 
dGrid.RowStyle = FindResource("GraphTableDataRowStyle") as Style; 
dGrid.ItemsSource = dsf.BoundedData; 
... 

它正確地變化,每行的背景色當溫度小於20.

現在我想在運行時動態更改HiAlarm和LoAlarm值。如果我可以創建與捆綁到背後的轉換代碼的風格,我會做這樣的事情:

DatagridAlarmConverter dac = new DatagridAlarmConverter(); 
dac.HiAlarm = HighAlarm; //public property in code behind object 
dac.LoAlarm = LowAlarm; 
//use this object somehow in style 

但我不知道如何爲此轉換對象代碼附加到後面的風格。

另外,我想通過代碼對象背後的轉換器作爲一個屬性,因爲類包含HighAlarm和LowAlarm並性質的,我需要:

<Style x:Key="GraphTableDataRowStyle" TargetType="{x:Type DataGridRow}"> 
    <Setter Property="Background" Value="{Binding Value, Converter={StaticResource DatagridAlarmConverter}, ConverterProperty=this}"/> 
</Style> 

然後我可以改變轉換器代碼來檢查屬性提取HighAlarm和LowAlarm值的對象。

但是在XAML中沒有「this」引用,所以我不知道該怎麼做。

所以我的問題是,我如何添加一個轉換器的代碼後面的樣式或如何可以將父對象傳遞給在XAML轉換器。

+0

你可以做一個「this」調用,但是我只用它作爲綁定路徑,不知道它是否可以在其他字段上使用,然後使用equals和period:「=。」。我使用它比如'Binding Path = .' –

+0

轉換器的資源,對嗎?你不能像使用其他資源一樣通過鍵FindResource()來獲取實例嗎? –

+0

你真正的問題。與多值轉換器的多重綁定? –

回答

1

Ed Plunkett讓我走上了解決方案的道路。我搜索瞭如何添加動態資源,並偶然發現了一些我所需要的代碼。

我確定,我可以創造一個風格代碼綁定到轉換器的背後是這樣的:

DatagridAlarmConverter dac = new DatagridAlarmConverter(); 
dac.HiAlarm = HighAlarm; 
dac.LoAlarm = LowAlarm; 
Style rowStyle = new Style(typeof(DataGridRow)); 
rowStyle.Setters.Add(new Setter(DataGridRow.BackgroundProperty, new Binding() 
     { 
      Converter = dac, 
      Path = new PropertyPath("Value") 
     })); 

然後我用這個新rowstyle而不是XAML之一。