Xceed WPF DataGrid - 主/细节:根据数据更改细胞部分的背景颜色

时间:2013-11-08 15:30:50

标签: wpf xaml master-detail xceed xceed-datagrid

我是WPF的新手,这可能解释了我这样做的难度。作为我想要做的一个例子,我使用了Xceed的MasterDetial示例应用程序的简化版本,该应用程序将Employees作为Master,并将与每个员工关联的Orders作为Details。 DetailConfigurations正在运行。我正在使用这个例子,因为我需要在更大更复杂的应用程序中使用相同的功能。

我遇到麻烦的地方是尝试在详细信息部分中更改单个DataCell的背景颜色。举例来说,我已经扩展了第一个主(员工)行并返回了一个订单列表。每个订单都有一个ShipCountry字段。如果ShipCountry的值是“波兰”,我想将ShipCountry单元格(仅限该单元格)的背景更改为红色。

尽管存在目标类型的DataCell,但下面对整行进行了处理。我无法弄清楚为什么会这样。我已经根据我在搜索这个问题时发现的事情尝试了许多不同的方法,但没有一个有效。我想我错过了一些明显的东西,这是一个简单的绑定问题,但这就是WPF(以及Xceed网格)的新手阻碍了我。

非常感谢任何帮助!

<xcdg:DataGridControl
     x:Name="grid"
     AllowDetailToggle="{Binding Source={x:Static local:MainPageParams.Singleton},Path=AllowDetailToggle}"
     AutoCreateDetailConfigurations="False"
     CellEditorDisplayConditions="None"
     EditTriggers="BeginEditCommand,ActivationGesture,ClickOnCurrentCell"
     ItemScrollingBehavior="Immediate"
     ItemsSource="{Binding Source={StaticResource cvsEmployees}}">
        <xcdg:DataGridControl.Resources>
            <Style TargetType="{x:Type xcdg:DataCell}">
                <Style.Triggers>

                    <!-- Fieldname not a valid property...
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding Path=ShipCountry}" Value="Poland"/>
                            <Condition Binding="{Binding Self, Path=FieldName}" Value="ShipCountry"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Background" Value="Red"/>
                    </MultiDataTrigger>
                    -->

                    <!-- This changes the entire row to Red, not just the ShipCountry field-->
                    <DataTrigger Binding="{Binding Path=ShipCountry}" Value="Poland">
                        <Setter Property="Background" Value="Red"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </xcdg:DataGridControl.Resources>
        <xcdg:DataGridControl.View>

...

1 个答案:

答案 0 :(得分:1)

我认为你的第一个例子的问题是:

Binding="{Binding Self, Path=FieldName}"

这就是我对我的所作所为。我刚刚交换使用你的参数。

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=FieldName}" Value="ShipCountry" />
        <Condition Binding="{Binding ShipCountry}" Value="Poland" />
    </MultiDataTrigger.Conditions>
    <Setter Property="Background" Value="Red" />
</MultiDataTrigger>

或者我这样做的另一种方式是在列的datatemplate中:

列声明:

<xcdg:Column Title="Ship Country"
    CellContentTemplate="{StaticResource ShipCountryDataTemplate}"
    FieldName="ShipCountry" />

<强>的DataTemplate

    <DataTemplate x:Key="ShipCountryDataTemplate" DataType="{x:Type dat:Order}">
        <TextBlock x:Name="txt" 
            Text="{Binding}" />
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=xcdg:DataRow, AncestorLevel=1}, Path=DataContext.EmployeeChanged, Mode=OneWay}" Value="True">
                <Setter TargetName="txt" Property="Background" Value="Red" />
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>