Datagrid绑定到集合,有一列转换的问题

时间:2011-03-12 11:03:58

标签: wpf datagrid binding converters

我有一个问题就是以自定义方式绑定我的数据网格的一列。 所以,我有这个代码:

<DataGridTemplateColumn Header="State">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Label Background="" Content="{Binding Path=., Converter={StaticResource measureConv}}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

我的转换器:

public class MeasureToStateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Measure m;
        try
        {
            m = (Measure)value;
            if (m.Value > 100)
            {
                return "Alarm";
            }
        }
        catch (Exception ex)
        {
            Debugger.Log(0, "Convertery", "Bład Convertera MeasureToState" + ex.Message);
        }
        return "Normal";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

内容和背景属性是自定义的。我使用转换器来检查我的集合对象是否满足某些条件结束返回String YES,或者NO,但是如果我想在一个颜色背景中有字符串字段YES,如果它是NO,则我是另一种颜色。

我怎么能这么容易? 我觉得写第二个转换器有点愚蠢。

3 个答案:

答案 0 :(得分:1)

您可以使用两个相应的标签创建两个DataTemplates,并使用DataTemplateSelector代替值转换器来获取正确的模板。

答案 1 :(得分:0)

将Label的Background属性绑定到它自己的Content属性,并使用转换器返回所需的Brush:

<Label Background="{Binding Path=Content, RelativeSource={RelativeSource Self}, Converter={StaticResource ContentToBrushConverter}"/>

转换器将接收Content属性的值...如果等于“Yes”,则返回Brushes.Green,如果等于“No”则返回Brushes.Red

答案 2 :(得分:0)

您可以重复使用转换器设置背景并使用DataTrigger更改内容 我已经将Measure对象中的字段称为Value。

应用转换器以显示DataGrid中的列内容:

<DataGridTextColumn 
   Header="State" 
   Width="SizeToHeader"
   Binding="{Binding Value, Converter={StaticResource measureConv}}" 
   CellStyle="{StaticResource ResourceKey=BackgroundCellStyle}"
   FontSize="20" />

应用转换器来改变风格:

<Window.Resources>
  <Style TargetType="{x:Type DataGridCell}" x:Key="BackgroundCellStyle">
    <Setter Property="Background" Value="Aqua"/>
    <Style.Triggers>
      <DataTrigger Binding="{Binding Path=Value, Converter={StaticResource measureConv}}" Value="Alarm">
        <Setter Property="Background" Value="Chartreuse"/>
      </DataTrigger>
    </Style.Triggers>
  </Style>
</Window.Resources>