我有一个数据网格,其中包含日期和值(温度)列表。我有一个valueconverter对象,如果温度太高或太低,会为每行的背景着色。这段代码工作正常:
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 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
但我不知道如何将此转换器对象附加到后面代码中的样式。
或者,我想将Code Behind对象作为属性传递给转换器,因为该类包含我需要的HighAlarm和LowAlarm属性:
<Style x:Key="GraphTableDataRowStyle" TargetType="{x:Type DataGridRow}">
<Setter Property="Background" Value="{Binding Value, Converter={StaticResource DatagridAlarmConverter}, ConverterProperty=this}"/>
</Style>
然后我可以更改转换器代码以检查对象的属性以提取HighAlarm和LowAlarm值。
但是没有&#34;这个&#34;在XAML中引用,所以我也不知道如何做到这一点。
所以我的问题是,如何在代码后面的样式中添加转换器,或者如何将父对象传递给XAML中的转换器。
答案 0 :(得分:1)
我确定我可以在代码后面的样式中创建对转换器的绑定,如下所示:
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。