Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# RadGridView单元模板_C#_Wpf_Telerik_Radgridview_Celltemplate - Fatal编程技术网

C# RadGridView单元模板

C# RadGridView单元模板,c#,wpf,telerik,radgridview,celltemplate,C#,Wpf,Telerik,Radgridview,Celltemplate,我需要更改RadGridView的CellTemplate。我在网上找到的所有示例都在Xaml中静态定义了列,然后在该列标记中,它们定义了CellTemplate: <telerik:RadGridView AutoGenerateColumns="False" ItemsSource="{Binding}" RowStyleSelector="{StaticResource styleSelector}"> <telerik:RadGridView.Columns&g

我需要更改RadGridView的CellTemplate。我在网上找到的所有示例都在Xaml中静态定义了列,然后在该列标记中,它们定义了CellTemplate:

<telerik:RadGridView AutoGenerateColumns="False" ItemsSource="{Binding}" RowStyleSelector="{StaticResource styleSelector}">
    <telerik:RadGridView.Columns>
        <telerik:GridViewDataColumn DataMemberBinding="{Binding ID}" CellTemplateSelector="{StaticResource templateSelector}" />
    </telerik:RadGridView.Columns>
</telerik:RadGridView>
<telerik:RadGridView.Columns>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Dongle.DongleID}" Header="DongleID">
        <telerik:GridViewDataColumn.AggregateFunctions>
            <telerik:CountFunction ResultFormatString="{}Dongles: {0}" />
        </telerik:GridViewDataColumn.AggregateFunctions>
    </telerik:GridViewDataColumn>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows.Count}" Header="Licences"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Customer.CustomerName}" Header="Customer"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsReplacementDongle}" Header="Replacement?" 
                                IsVisible="False"
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsEducationalDongle}" Header="Educational?"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongle.DongleID}" Header="Replaced"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongleStatus}" Header="Replacement Status"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"/>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows[0].OrderRowCosts[0].CostValue }" Header="Sub-Total (AUD)">
    </telerik:GridViewDataColumn>

</telerik:RadGridView.Columns>

上面的示例仅为标题为“ID”的列加载CellTemplate,并为该列中的所有单元格加载CellTemplate

<telerik:RadGridView.Columns>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Dongle.DongleID}" Header="DongleID">
        <telerik:GridViewDataColumn.AggregateFunctions>
            <telerik:CountFunction ResultFormatString="{}Dongles: {0}" />
        </telerik:GridViewDataColumn.AggregateFunctions>
    </telerik:GridViewDataColumn>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows.Count}" Header="Licences"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Customer.CustomerName}" Header="Customer"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsReplacementDongle}" Header="Replacement?" 
                                IsVisible="False"
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsEducationalDongle}" Header="Educational?"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongle.DongleID}" Header="Replaced"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongleStatus}" Header="Replacement Status"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"/>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows[0].OrderRowCosts[0].CostValue }" Header="Sub-Total (AUD)">
    </telerik:GridViewDataColumn>

</telerik:RadGridView.Columns>
我已经成功地在代码隐藏中加载了CellTemplates,但这需要我将整个网格的一个实例传递给ViewModel,并且还必须向GridView添加一个dependency属性,以将网格的列绑定到ViewModel中的GridViewColumnCollection

<telerik:RadGridView.Columns>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Dongle.DongleID}" Header="DongleID">
        <telerik:GridViewDataColumn.AggregateFunctions>
            <telerik:CountFunction ResultFormatString="{}Dongles: {0}" />
        </telerik:GridViewDataColumn.AggregateFunctions>
    </telerik:GridViewDataColumn>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows.Count}" Header="Licences"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Customer.CustomerName}" Header="Customer"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsReplacementDongle}" Header="Replacement?" 
                                IsVisible="False"
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsEducationalDongle}" Header="Educational?"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongle.DongleID}" Header="Replaced"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongleStatus}" Header="Replacement Status"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"/>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows[0].OrderRowCosts[0].CostValue }" Header="Sub-Total (AUD)">
    </telerik:GridViewDataColumn>

</telerik:RadGridView.Columns>
这是一个非常混乱的解决办法,如果用错误的眼睛看,我肯定会被炒鱿鱼。我需要做的事情与此类似:

<telerik:RadGridView.CellTemplateSelector>
    <local:MyTemplateSelector>
        <local:MyTemplateSelector.NormalTemplate>
            <DataTemplate>
                ...Some [Normal] template...
            </DataTemplate>
        </local:MyTemplateSelector.NormalTemplate
        <local:MyTemplateSelector.DropdownTemplate>
            <DataTemplate>
                ...Some [ComboBox] template...
            </DataTemplate>
        </local:MyTemplateSelector.DropdownTemplate>
    </local:MyTemplateSelector>
</telerik:RadGridView.CellTemplateSelector>
<telerik:RadGridView.Columns>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Dongle.DongleID}" Header="DongleID">
        <telerik:GridViewDataColumn.AggregateFunctions>
            <telerik:CountFunction ResultFormatString="{}Dongles: {0}" />
        </telerik:GridViewDataColumn.AggregateFunctions>
    </telerik:GridViewDataColumn>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows.Count}" Header="Licences"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Customer.CustomerName}" Header="Customer"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsReplacementDongle}" Header="Replacement?" 
                                IsVisible="False"
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsEducationalDongle}" Header="Educational?"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongle.DongleID}" Header="Replaced"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongleStatus}" Header="Replacement Status"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"/>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows[0].OrderRowCosts[0].CostValue }" Header="Sub-Total (AUD)">
    </telerik:GridViewDataColumn>

</telerik:RadGridView.Columns>

…某些[正常]模板。。。

因此,在这之前,我不确定“正确”的方式来做这件事,因为WPF似乎是如此高度的上下文,它似乎真的是一个最适合您的特殊需要的案例

<telerik:RadGridView.Columns>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Dongle.DongleID}" Header="DongleID">
        <telerik:GridViewDataColumn.AggregateFunctions>
            <telerik:CountFunction ResultFormatString="{}Dongles: {0}" />
        </telerik:GridViewDataColumn.AggregateFunctions>
    </telerik:GridViewDataColumn>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows.Count}" Header="Licences"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Customer.CustomerName}" Header="Customer"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsReplacementDongle}" Header="Replacement?" 
                                IsVisible="False"
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsEducationalDongle}" Header="Educational?"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongle.DongleID}" Header="Replaced"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongleStatus}" Header="Replacement Status"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"/>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows[0].OrderRowCosts[0].CostValue }" Header="Sub-Total (AUD)">
    </telerik:GridViewDataColumn>

</telerik:RadGridView.Columns>
我自己的方法可能不是最推荐的方法,但我需要集中所有样式选择器和单元选择器变体,并使用代码编写的逻辑,而不是xaml

<telerik:RadGridView.Columns>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Dongle.DongleID}" Header="DongleID">
        <telerik:GridViewDataColumn.AggregateFunctions>
            <telerik:CountFunction ResultFormatString="{}Dongles: {0}" />
        </telerik:GridViewDataColumn.AggregateFunctions>
    </telerik:GridViewDataColumn>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows.Count}" Header="Licences"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Customer.CustomerName}" Header="Customer"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsReplacementDongle}" Header="Replacement?" 
                                IsVisible="False"
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsEducationalDongle}" Header="Educational?"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongle.DongleID}" Header="Replaced"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongleStatus}" Header="Replacement Status"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"/>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows[0].OrderRowCosts[0].CostValue }" Header="Sub-Total (AUD)">
    </telerik:GridViewDataColumn>

</telerik:RadGridView.Columns>
我使用的方法类似于telerik.StyleRule方法,但更简单,就像atm背后的代码一样。我没有在共享xaml资源库中定义或在每个视图中定义,而是在单个文件夹中使用类,并在xaml中使用CLR名称空间和ect简单地调用它(当然也可以在代码隐藏中设置)

<telerik:RadGridView.Columns>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Dongle.DongleID}" Header="DongleID">
        <telerik:GridViewDataColumn.AggregateFunctions>
            <telerik:CountFunction ResultFormatString="{}Dongles: {0}" />
        </telerik:GridViewDataColumn.AggregateFunctions>
    </telerik:GridViewDataColumn>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows.Count}" Header="Licences"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Customer.CustomerName}" Header="Customer"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsReplacementDongle}" Header="Replacement?" 
                                IsVisible="False"
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsEducationalDongle}" Header="Educational?"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongle.DongleID}" Header="Replaced"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongleStatus}" Header="Replacement Status"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"/>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows[0].OrderRowCosts[0].CostValue }" Header="Sub-Total (AUD)">
    </telerik:GridViewDataColumn>

</telerik:RadGridView.Columns>
它使用列名,并且非常容易使用以下内容定义条件:

Expression<Func<BaseModelForAllTableObjectClasses,bool>>
<telerik:RadGridView.Columns>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Dongle.DongleID}" Header="DongleID">
        <telerik:GridViewDataColumn.AggregateFunctions>
            <telerik:CountFunction ResultFormatString="{}Dongles: {0}" />
        </telerik:GridViewDataColumn.AggregateFunctions>
    </telerik:GridViewDataColumn>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows.Count}" Header="Licences"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Customer.CustomerName}" Header="Customer"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsReplacementDongle}" Header="Replacement?" 
                                IsVisible="False"
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsEducationalDongle}" Header="Educational?"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongle.DongleID}" Header="Replaced"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongleStatus}" Header="Replacement Status"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"/>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows[0].OrderRowCosts[0].CostValue }" Header="Sub-Total (AUD)">
    </telerik:GridViewDataColumn>

</telerik:RadGridView.Columns>
表达式
它使用的实际资源(datatemplate和样式)是在共享xaml资源库中定义的,但如果需要,这些资源可以非常通用

<telerik:RadGridView.Columns>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Dongle.DongleID}" Header="DongleID">
        <telerik:GridViewDataColumn.AggregateFunctions>
            <telerik:CountFunction ResultFormatString="{}Dongles: {0}" />
        </telerik:GridViewDataColumn.AggregateFunctions>
    </telerik:GridViewDataColumn>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows.Count}" Header="Licences"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Customer.CustomerName}" Header="Customer"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsReplacementDongle}" Header="Replacement?" 
                                IsVisible="False"
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsEducationalDongle}" Header="Educational?"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongle.DongleID}" Header="Replaced"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongleStatus}" Header="Replacement Status"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"/>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows[0].OrderRowCosts[0].CostValue }" Header="Sub-Total (AUD)">
    </telerik:GridViewDataColumn>

</telerik:RadGridView.Columns>
这有点粗糙,如果有兴趣,我会留下评论

<telerik:RadGridView.Columns>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Dongle.DongleID}" Header="DongleID">
        <telerik:GridViewDataColumn.AggregateFunctions>
            <telerik:CountFunction ResultFormatString="{}Dongles: {0}" />
        </telerik:GridViewDataColumn.AggregateFunctions>
    </telerik:GridViewDataColumn>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows.Count}" Header="Licences"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Customer.CustomerName}" Header="Customer"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsReplacementDongle}" Header="Replacement?" 
                                IsVisible="False"
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsEducationalDongle}" Header="Educational?"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongle.DongleID}" Header="Replaced"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongleStatus}" Header="Replacement Status"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"/>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows[0].OrderRowCosts[0].CostValue }" Header="Sub-Total (AUD)">
    </telerik:GridViewDataColumn>

</telerik:RadGridView.Columns>
MyProject.CellStyleSelector

/// <summary>
/// Used in CellStyleSelector and its inheriting classes.
/// 
/// Wouldnt be too hard to modify to allow declarative if highly desired.
/// 
/// NOTE - tried extending telerik.StyleRule, issues with setting condition value
/// </summary>
public class CellStyleRule
{
    /*
    object _Value;
    public object Value
    {
        get
        {
            return this._Value;
        }
        set
        {
            this._Value = value;
        }
    }
     */

    // NOTE - if needing to widen use case, use <T>, but ONLY if needed
    Expression<Func<BaseDataModel, bool>> _Condition;
    public Expression<Func<BaseDataModel, bool>> Condition
    {
        get
        {
            return this._Condition;
        }
        set
        {
            this._Condition = value;
        }
    }


    Style _Style;
    public Style Style
    {
        get
        {
            return this._Style;
        }
        set
        {
            this._Style = value;
        }
    }



    public CellStyleRule(Expression<Func<BaseDataModel, bool>> c, string s)
    {
        var d = App.Current.FindResource(s);
        if (d != null)
            this.Style = d as Style;
        else
            throw new Exception("No such style resource as '" + s + "'");

        // Value = v;
        Condition = c;
    }



    /*
    public CellStyleRule(string c, string s)
    {
        var d = App.Current.FindResource(s);
        if (d != null)
            Style = d as Style;
        else
            throw new Exception("No such style resource as '" + s + "'");

        // TODO - test - guessing at how to do this based on telerik classes

        // Value = v;
        Telerik.Windows.Data.ExpressionTypeConverter converter = new Telerik.Windows.Data.ExpressionTypeConverter();
        Condition = (System.Linq.Expressions.Expression) converter.ConvertFromString(c);

        c.ToString();
    }
     */
}






// NOTE IMPORTANT - use of xaml defined ConditionalStyleSelectors is not a bad alternative approach, though diferent selector
//                  for each column it could all be defined in same resource dictionary
//                - problem is that issues encountered with Enums, so decided on this approach instead

/// <summary>
/// A variation of StyleSelecter not unlike telerik:ConditionalStyleSelector. 
/// 
/// However, rules are defined using a Dictionary<string,CellStyle> to distinct columns and use same 
/// selector, with rules (currently) defined not declarativly (xaml), but in inheriting classes, 
/// typically one for each entity type requiring a RadGridView and conditional styling.
/// </summary>
public abstract class CellStyleSelector : StyleSelector
{
    // public Dictionary<String, Dictionary<string, Style>> conditions { get; set; }


    // Use a Dictionary mapping X columns to individual Lists of rules to check
    Dictionary<string, List<CellStyleRule>> _Rules;
    public Dictionary<string, List<CellStyleRule>> Rules
    {
        get
        {
            if (this._Rules == null)
            {
                this._Rules = new Dictionary<string, List<CellStyleRule>>();
            }

            return this._Rules;
        }
        set { this._Rules = value; }
    }

    public override Style SelectStyle(object item, DependencyObject container)
    {
        if (item is BaseDataModel)
        {
            GridViewCell cell = container as GridViewCell;
            var currentColumn = cell.Column as GridViewDataColumn;
            string key = currentColumn.DataMemberBinding.Path.Path;


            if (Rules.ContainsKey(key))
            {
                foreach (CellStyleRule rule in Rules[key])
                {
                    // string debug = DebugHelper.Debug(rule.Condition);

                    // REVERTED NOTE - if just Func<>
                    // if (rule.Condition((BaseDataModel)item))

                    // NOTE - if Expression<Func<>>, first compile then pass in param
                    if (rule.Condition.Compile()((BaseDataModel)item))
                    {
                        return rule.Style;
                    }
                }
            }

        }
        return null;
    }


}


/// <summary>
/// Used in CellCellTemplateRuleSelector and its inheriting classes.
/// 
/// Wouldnt be too hard to modify to allow declarative if highly desired.
/// </summary>
public class CellTemplateRule
{
    /*
    object _Value;
    public object Value
    {
        get
        {
            return this._Value;
        }
        set
        {
            this._Value = value;
        }
    }
     */

    // NOTE - if needing to widen use case, use <T>, but ONLY if needed
    Expression<Func<BaseDataModel, bool>> _Condition;
    public Expression<Func<BaseDataModel, bool>> Condition
    {
        get
        {
            return this._Condition;
        }
        set
        {
            this._Condition = value;
        }
    }


    DataTemplate _Template;
    public DataTemplate Template
    {
        get
        {
            return this._Template;
        }
        set
        {
            this._Template = value;
        }
    }



    public CellTemplateRule(Expression<Func<BaseDataModel, bool>> c, string s)
    {
        var d = App.Current.FindResource(s);
        if (d != null)
            this.Template = d as DataTemplate;
        else
            throw new Exception("No such template resource as '" + s + "'");

        Condition = c;
    }


}

// Implementing class, used for any licence table
public class LicenceTableCellStyleSelector : CellStyleSelector
{
    public LicenceTableCellStyleSelector()
        : base()
    {
        this.Rules = new Dictionary<string, List<CellStyleRule>>()
        {
            { "LicenceStatus" , new List<CellStyleRule>()
                {
                    // Always most specific rules at top

                    // Error catcher, leave in as visual cue just in case
                    { new CellStyleRule(x => ((Licence)x).LicenceExpires < DateTime.Now && ((Licence)x).LicenceStatus != LicenceStatus.Expired, "CellStyle_Licence_ExpiryMismatch") } ,

                    { new CellStyleRule(x => ((Licence)x).LicenceStatus == LicenceStatus.Active, "CellStyle_Status_Active") } ,

                    // Same as != Active, as only those would through this far
                    { new CellStyleRule(x => x != null, "CellStyle_Status_Inactive") } ,


                }
            },

            { "LicenceType" , new List<CellStyleRule>()
                {                        
                    { new CellStyleRule(x => ((Licence)x).LicenceType == LicenceType.Full, "CellStyle_Licence_Full") } ,
                    { new CellStyleRule(x => ((Licence)x).LicenceType == LicenceType.Upgrade, "CellStyle_Licence_Upgrade") } ,

                    // Timed, uses fallthrough so no need to actually check unless wanting to distinct types of timed
                    { new CellStyleRule(x => x != null, "CellStyle_Licence_Timed") } ,
                }
            },

            { "LicenceExpired" , new List<CellStyleRule>()
                {                        
                    { new CellStyleRule(x => ((Licence)x).LicenceExpires < DateTime.Now && ((Licence)x).LicenceStatus != LicenceStatus.Expired, "CellStyle_Licence_ExpiryMismatch")  }, 
                    { new CellStyleRule(x => ((Licence)x).LicenceExpires < ((Licence)x).LicenceIssued, "CellStyle_Licence_ExpiryMismatch") } ,
                }
            },

            { "LicenceIssued" , new List<CellStyleRule>()
                {
                    { new CellStyleRule(x => ((Licence)x).LicenceExpires < ((Licence)x).LicenceIssued, "CellStyle_Licence_ExpiryMismatch") } ,
                }
            }
        };
    }
}
/// <summary>
/// Used in CellCellTemplateRuleSelector and its inheriting classes.
/// 
/// Wouldnt be too hard to modify to allow declarative if highly desired.
/// </summary>
public class CellTemplateRule
{
    /*
    object _Value;
    public object Value
    {
        get
        {
            return this._Value;
        }
        set
        {
            this._Value = value;
        }
    }
     */

    // NOTE - if needing to widen use case, use <T>, but ONLY if needed
    Expression<Func<BaseDataModel, bool>> _Condition;
    public Expression<Func<BaseDataModel, bool>> Condition
    {
        get
        {
            return this._Condition;
        }
        set
        {
            this._Condition = value;
        }
    }


    DataTemplate _Template;
    public DataTemplate Template
    {
        get
        {
            return this._Template;
        }
        set
        {
            this._Template = value;
        }
    }



    public CellTemplateRule(Expression<Func<BaseDataModel, bool>> c, string s)
    {
        var d = App.Current.FindResource(s);
        if (d != null)
            this.Template = d as DataTemplate;
        else
            throw new Exception("No such template resource as '" + s + "'");

        Condition = c;
    }


}

// NOTE IMPORTANT - use of xaml defined ConditionalTemplateSelectors is not a bad alternative approach, though diferent selector
//                  for each column it could all be defined in same resource dictionary
//                - problem is that issues encountered with Enums, so decided on this approach instead

/// <summary>
/// See CellStyleSelector, this is a variant used with the CellTemplateSelector property
/// </summary>
public abstract class CellTemplateSelector : DataTemplateSelector
{
    // public Dictionary<String, Dictionary<string, Template>> conditions { get; set; }


    // Use a Dictionary mapping X columns to individual Lists of rules to check
    Dictionary<string, List<CellTemplateRule>> _Rules;
    public Dictionary<string, List<CellTemplateRule>> Rules
    {
        get
        {
            if (this._Rules == null)
            {
                this._Rules = new Dictionary<string, List<CellTemplateRule>>();
            }

            return this._Rules;
        }
        set { this._Rules = value; }
    }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is BaseDataModel)
        {
            GridViewCell cell = container as GridViewCell;
            var currentColumn = cell.Column as GridViewDataColumn;
            string key = currentColumn.DataMemberBinding.Path.Path;


            if (Rules.ContainsKey(key))
            {
                foreach (CellTemplateRule rule in Rules[key])
                {
                    // string debug = DebugHelper.Debug(rule.Condition);

                    // REVERTED NOTE - if just Func<>
                    // if (rule.Condition((BaseDataModel)item))

                    // NOTE - if Expression<Func<>>, first compile then pass in param
                    if (rule.Condition.Compile()((BaseDataModel)item))
                    {
                        return rule.Template;
                    }
                }
            }

        }
        return null;
    }


}


// Implementing class for a different table, though RadGridView can use both CellStyleSelector and CellTemplateSelector at same time, i just didnt need yet
public class OrderDongleWrapTableCellTemplateSelector : CellTemplateSelector
{
    public OrderDongleWrapTableCellTemplateSelector()
        : base()
    {
        this.Rules = new Dictionary<string, List<CellTemplateRule>>()
        {
            { "ReplacedDongle.DongleID" , new List<CellTemplateRule>()
                {
                    // Always most specific rules at top


                    { new CellTemplateRule(x => ((OrderDongleWrap)x).IsReplacementDongle == false  , "CellTemplate_OrderDongleWrap_NotReplacementDongler_NAField") },


                }
            },
            { "ReplacedDongleStatus" , new List<CellTemplateRule>()
                {
                    // Always most specific rules at top


                    { new CellTemplateRule(x => ((OrderDongleWrap)x).IsReplacementDongle == false  , "CellTemplate_OrderDongleWrap_NotReplacementDongler_NAField") },


                }
            },
            /*
             * // REVERTED - better to just set to UNKNOWN CUSTOMER explicitly before shown in table, rather than overwrite datatemplate
            { "Customer.CustomerName" , new List<CellTemplateRule>()
                {
                    // Always most specific rules at top


                    { new CellTemplateRule(x => ((OrderDongleWrap)x).Customer == null || ((OrderDongleWrap)x).Customer.CustomerID == 1 , "CellTemplate_OrderDongleWrap_UnknownCustomerField") },


                }
            },
            */
        };
    }
}
<telerik:RadGridView.Resources>                               
    <gridviewstyleselectors:LicenceTableCellStyleSelector x:Key="LicenceTableCellStyleSelector" />
</telerik:RadGridView.Resources>

<telerik:RadGridView.Columns>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding DongleID}" Header="DongleID"  IsReadOnly="True" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding LicenceSerial}" Header="Serial"  IsReadOnly="True" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding LicenceStatus}" Header="Status"  IsReadOnly="True" 
                                CellStyleSelector="{StaticResource LicenceTableCellStyleSelector}"/>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Product.ProductName}" Header="Product"  IsReadOnly="True" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding LicenceType}" Header="Licence Type" 
                                CellStyleSelector="{StaticResource LicenceTableCellStyleSelector}" IsReadOnly="True" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding LicenceIssued}" Header="Issued" 
                                CellStyleSelector="{StaticResource LicenceTableCellStyleSelector}" IsReadOnly="True" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding LicenceExpires}" Header="Expiry" 
                                CellStyleSelector="{StaticResource LicenceTableCellStyleSelector}" IsReadOnly="True" />
</telerik:RadGridView.Columns>
<telerik:RadGridView.Columns>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Dongle.DongleID}" Header="DongleID">
        <telerik:GridViewDataColumn.AggregateFunctions>
            <telerik:CountFunction ResultFormatString="{}Dongles: {0}" />
        </telerik:GridViewDataColumn.AggregateFunctions>
    </telerik:GridViewDataColumn>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows.Count}" Header="Licences"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding Customer.CustomerName}" Header="Customer"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsReplacementDongle}" Header="Replacement?" 
                                IsVisible="False"
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}" />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding IsEducationalDongle}" Header="Educational?"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongle.DongleID}" Header="Replaced"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"  />
    <telerik:GridViewDataColumn DataMemberBinding="{Binding ReplacedDongleStatus}" Header="Replacement Status"  
                                CellStyleSelector="{StaticResource OrderDongleWrapTableCellStyleSelector}"
                                CellTemplateSelector="{StaticResource OrderDongleWrapTableCellTemplateSelector}"/>
    <telerik:GridViewDataColumn DataMemberBinding="{Binding OrderRows[0].OrderRowCosts[0].CostValue }" Header="Sub-Total (AUD)">
    </telerik:GridViewDataColumn>

</telerik:RadGridView.Columns>
//
///用于CellStyleSelector及其继承类。
/// 
///如果非常需要的话,修改以允许声明性的也不会太难。
/// 
///注意-尝试扩展telerik.StyleRule,设置条件值时出现问题
/// 
公共类CellStyleRule
{
/*
对象值;
公共对象价值
{
得到
{
返回此值;
}
设置
{
此值为._值=值;
}
}
*/
//注意-如果需要扩展用例,请使用,但仅在需要时使用
表达条件;
公开表达条件
{
得到
{
返回此条件;
}
设置
{
这个条件=值;
}
}
风格(风格),;
公共风格
{
得到
{
返回此样式;
}
设置
{
这个。_Style=value;
}
}
公共CellStyleRule(表达式c,字符串s)
{
var d=应用程序当前的FindResource;
如果(d!=null)
this.Style=d作为Style;
其他的
抛出新异常(“没有诸如“'+s+””之类的样式资源”);
//值=v;
条件=c;
}
/*
公共CellStyleRule(字符串c、字符串s)
{
var d=应用程序当前的FindResource;
如果(d!=null)
风格=d为风格;
其他的
抛出新异常(“没有诸如“'+s+””之类的样式资源”);
//TODO-测试-根据telerik类猜测如何执行此操作
//值=v;
Telerik.Windows.Data.ExpressionTypeConverter converter=新Telerik.Windows.Data.ExpressionTypeConverter();
Condition=(System.Linq.Expressions.Expression)converter.ConvertFromString(c);
c、 ToString();
}
*/
}
//注意重要事项-使用xaml定义的ConditionalStyleSelector并不是一种坏的替代方法,尽管选择器不同
//对于每个列,都可以在同一个资源字典中定义
//-问题是枚举遇到了问题,因此决定使用此方法
/// 
///样式选择器的一种变体,与telerik不同:ConditionalStyleSelector。
/// 
///但是,使用字典定义规则以区分列并使用相同的
///选择器,其规则(当前)不是以声明方式(xaml)定义的,而是在继承类中定义的,
///通常,需要RadGridView和条件样式的每个实体类型各一个。
/// 
公共抽象类CellStyleSelector:StyleSelector
{
//公共字典条件{get;set;}
//使用字典将X列映射到要检查的单个规则列表
字典规则;
公共词典规则
{
得到
{
if(this.\u Rules==null)
{
这是。_Rules=new Dictionary();
}
返回此。\u规则;
}
设置{this.\u Rules=value;}
}
公共替代样式SelectStyle(对象项,DependencyObject容器)
{
如果(项为BaseDataModel)
{
GridViewCell=作为GridViewCell的容器;
var currentColumn=cell.Column作为GridViewDataColumn;
string key=currentColumn.DataMemberBinding.Path.Path;
if(集装箱规则(关键))
{
foreach(规则[key]中的CellStyleRule规则)
{
//string debug=DebugHelper.debug(rule.Condition);
//还原的注释-如果只是Func
//if(规则条件((BaseDataModel)项))
//注意-如果是表达式,请先编译,然后传入参数
if(rule.Condition.Compile()((BaseDataModel)项))
{
返回规则。样式;
}
}
}
}
返回null;
}
}
/// 
///用于CellTemplateRuleSelector及其inhe