WPF根据内容更改单元格背景颜色
WPF change cell background color based on content
我在尝试根据结构下的 Unbound 字段(具有 non-simple 后端结构)更改单元格背景颜色时遇到困难。
这是示例 "complex" 结构:
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>
我想要得到的是一个彩色网格,只有当根值为 null 时单元格才为黑色,当叶值为 null 时单元格为黑色。
显示的网格是生成第二列行的结果,一个新的 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)并创建逻辑以正确的方式为单元格着色。
在此先感谢,如果我没有正确解释问题,请发表评论。
再次感谢。
我通过声明一个多绑定转换器而不是像这样的简单的和不同的样式来解决这个问题:
<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;
...
就是这样。
对我来说似乎很脏,但由于我还没有找到一个优雅的解决方案,这会起作用
我在尝试根据结构下的 Unbound 字段(具有 non-simple 后端结构)更改单元格背景颜色时遇到困难。 这是示例 "complex" 结构:
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>
我想要得到的是一个彩色网格,只有当根值为 null 时单元格才为黑色,当叶值为 null 时单元格为黑色。
显示的网格是生成第二列行的结果,一个新的 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)并创建逻辑以正确的方式为单元格着色。
在此先感谢,如果我没有正确解释问题,请发表评论。
再次感谢。
我通过声明一个多绑定转换器而不是像这样的简单的和不同的样式来解决这个问题:
<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;
...
就是这样。 对我来说似乎很脏,但由于我还没有找到一个优雅的解决方案,这会起作用