WPF изменить цвет фона ячейки в зависимости от содержимого

У меня возникли трудности при попытке изменить цвет фона ячейки на основе поля 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>

То, что я хотел бы получить - это цветная сетка, ячейки черного цвета только тогда, когда корневое значение равно нулю, а не когда значение листа равно нулю. Цветная XamDataGrid

Показанная сетка является результатом создания строк второго столбца нового TestMember со значением, равным нулю. Я бы хотел, чтобы они не были окрашены в черный цвет и к ним относились иначе. Я устал от этого конвертера:

<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>

И что происходит, так это то, что CellValuePresenter, переданный в многозначный конвертер, не имеет прикрепленного поля, когда значение листа равно нулю, поэтому я не могу найти элегантный способ узнать, в каком столбце значение равно нулю (либо корень равен нулю, либо лист равен нулю)) и создать логику для правильного цвета ячейки.

Заранее спасибо, оставьте комментарий, если я не объяснил правильно проблему.

Еще раз спасибо.

1 ответ

Решение

Я решил проблему, объявив конвертер нескольких связей вместо простого и разных стилей, например:

<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 (columnValue)
{
                    case "keyX":
                        single = row.getKeyXValue();
                        colorToApply = getStandardColor(single);
                        break;
 ...

Это все. Мне кажется грязным, но так как я еще не нашел элегантного решения, это сработает

Другие вопросы по тегам