【问题标题】:How can I set a property on a Converter object at runtime如何在运行时在 Converter 对象上设置属性
【发布时间】: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 进行多重绑定?

标签: c# wpf datagrid


【解决方案1】:

Ed Plunkett 让我找到了解决方案。我在 Google 上搜索了如何添加动态资源,并偶然发现了一些可以满足我需求的代码。

我确定我可以在下面的代码中创建一个到转换器的绑定,如下所示:

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")
        }));

然后我使用了这个新的行样式而不是 XAML 行样式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多