WPF根据内容更改单元格背景颜色

时间:2016-05-06 09:02:35

标签: wpf cell infragistics xamdatagrid

我在尝试根据结构下面的Unbound字段(具有非简单的后端结构)更改单元格背景颜色时遇到了困难。 以下是“复杂”结构示例:

public class TestTable
{
    public int order { get; set; }
    public TestMember t1 { get; set; }
    public TestMember t2 { get; set; }
    public TestMember t3 { get; set; }
}

public class TestMember
{
    public TestMember(String i)
    {
        value = i;
    }

    public String value { get; set; }

}

这是XAML:

<igDP:XamDataGrid Name="xamDataGrid1">

        <igDP:XamDataGrid.ViewSettings>
            <igDP:GridViewSettings UseNestedPanels="False"/>
        </igDP:XamDataGrid.ViewSettings>

        <igDP:XamDataGrid.FieldSettings>
            <igDP:FieldSettings AllowRecordFiltering="true" FilterLabelIconDropDownType="MultiSelectExcelStyle" 
                                                        AllowEdit="False" AllowFixing="No" AllowSummaries="True"/>
        </igDP:XamDataGrid.FieldSettings>

        <igDP:XamDataGrid.FieldLayoutSettings>
            <igDP:FieldLayoutSettings AutoGenerateFields="False" FilterUIType="LabelIcons" 
                                                              HeaderPrefixAreaDisplayMode="FieldChooserButton" AllowClipboardOperations="All"
                                                              CopyFieldLabelsToClipboard="True" AddNewRecordLocation="OnTopFixed"
                                                              AllowAddNew="False" HighlightAlternateRecords="False" ExpansionIndicatorDisplayMode="Never"
                                          />
        </igDP:XamDataGrid.FieldLayoutSettings>
        <igDP:XamDataGrid.FieldLayouts>
            <igDP:FieldLayout Key="Layout0">
                <igDP:FieldLayout.SortedFields>
                    <igDP:FieldSortDescription  FieldName="order" Direction="Ascending"></igDP:FieldSortDescription>
                </igDP:FieldLayout.SortedFields>
                <igDP:FieldLayout.Fields>
                    <igDP:Field Name="order" Label="Ordinamento" AllowGroupBy="False"  Visibility="Collapsed" FixedLocation="FixedToNearEdge"/>
                    <igDP:UnboundField BindingMode="TwoWay" BindingPath="t1.value" Name="value" AllowEdit="True" Label="Anno Recoil" AllowGroupBy="False"  FixedLocation="FixedToNearEdge"/>
                    <igDP:UnboundField BindingMode="TwoWay" BindingPath="t2.value" Name="value" AllowEdit="True" Label="APC"  FixedLocation="FixedToNearEdge"/>
                    <igDP:UnboundField BindingMode="TwoWay" BindingPath="t3.value" Name="value" Label="R1" AllowEdit="True" FixedLocation="FixedToNearEdge"/>
                </igDP:FieldLayout.Fields>
            </igDP:FieldLayout>
        </igDP:XamDataGrid.FieldLayouts>

    </igDP:XamDataGrid>

我想得到的是一个彩色网格,只有当根值为空时,单元格才是黑色,而不是当叶子值为空时。 Colored XamDataGrid

显示的网格是生成第二列行的新TestMember,其值设置为null。 我希望他们不要被黑色和不同的对待。 我已经厌倦了这个转换器:

<igDP:XamDataGrid.Resources>
        <Style TargetType="{x:Type igDP:CellValuePresenter}">
            <Setter Property="Background">
                <Setter.Value>
                    <MultiBinding Converter="{StaticResource BackGroundConverter}">
                        <Binding RelativeSource="{RelativeSource Self}" Path="Value" />
                        <Binding RelativeSource="{RelativeSource Self}" Path="DataContext"/>
                        <Binding RelativeSource="{RelativeSource Self}" />
                        <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Value" />
                    </MultiBinding>
                </Setter.Value>
            </Setter>
        </Style>
    </igDP:XamDataGrid.Resources>

当叶子值为null时,传递给多值转换器的CellValuePresenter没有附加字段,所以我找不到一种优雅的方法来检索哪个列的值为null(由root为null或者leaf为null)并创建一个逻辑,以适当的方式为单元格着色。

如果我没有正确解释问题,请提前致谢,发表评论。

再次感谢。

1 个答案:

答案 0 :(得分:0)

我通过声明一个多绑定转换器而不是简单的转换器和不同的样式解决了这个问题:

<Style TargetType="{x:Type igDP:CellValuePresenter}" x:Key="keyX">
            <Setter Property="Background">
                <Setter.Value>
                    <MultiBinding Converter="{StaticResource BackGroundConverter}">
                        <Binding RelativeSource="{RelativeSource Self}" Path="Value" />
                        <Binding RelativeSource="{RelativeSource Self}" Path="DataContext"/>
                        <Binding Source="keyX"/>
                    </MultiBinding>
                </Setter.Value>
            </Setter>
        </Style>

在多值转换器内部,我根据传递的密钥进行检查。 显然,在XamDataGrid中,您将样式绑定到对应字段,如下所示:

<igDP:UnboundField BindingMode="TwoWay" BindingPath="keyX.value" Name="value" AllowEdit="True" Label="Carica VN" FixedLocation="FixedToNearEdge">
      <igDP:Field.Settings>
            <igDP:FieldSettings CellValuePresenterStyle="{StaticResource keyX}" />
      </igDP:Field.Settings>
</igDP:UnboundField>

并在MultiValueConverter中根据第三个绑定创建一个switch-case:

switch (columnValue)
{
                    case "keyX":
                        single = row.getKeyXValue();
                        colorToApply = getStandardColor(single);
                        break;
 ...

这就是全部。 对我来说似乎很脏,但由于我还没有找到一个优雅的解决方案,这将起作用