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>
То, что я хотел бы получить - это цветная сетка, ячейки черного цвета только тогда, когда корневое значение равно нулю, а не когда значение листа равно нулю.
Показанная сетка является результатом создания строк второго столбца нового 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;
...
Это все. Мне кажется грязным, но так как я еще не нашел элегантного решения, это сработает