【发布时间】:2017-04-07 20:06:35
【问题描述】:
我有一个包含日期和值(温度)列表的数据网格。我有一个 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 值。
但 XAML 中没有“this”引用,所以我也不知道该怎么做。
所以我的问题是,如何将转换器添加到代码后面的样式中,或者如何将父对象传递给 XAML 中的转换器。
【问题讨论】:
-
你可以做一个“this”调用。但我只将它用于绑定路径。不确定它是否适用于其他字段。使用等于然后一个句点:“=。 "。我像
Binding Path=.一样使用它 -
转换器是一种资源,对吧?您不能像使用其他资源一样使用
FindResource()按键获取实例吗? -
到您的实际问题。您是否探索过使用 multivalueconverter 进行多重绑定?