如何在运行时在Converter对象上设置属性

时间:2017-04-07 20:06:36

标签: c# wpf datagrid

我有一个数据网格,其中包含日期和值(温度)列表。我有一个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中的转换器。

1 个答案:

答案 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。