这个一个很拗口的标题,其实,我需要的是一个很简单的功能。为了把这个需求解释清楚,用一个小的案例说明:

用DataGrid绑定Customers表,按照常识,Customer会有不同的Priority,那么UI需要因Priority不同而表现各异。比如High的Customer,应该是粗体,而Low的Customer,颜色就是Gray。

问题来了,WPF提供了完善的Style, Setter来控制UI控件的Property,但,因为UI控件Binding到具体的Object,而Priority是Object的属性,而不是UI控件的Field,所以下面这段常用的Style无效(这段Code用来控制加粗选中的TreeViewItem)。

<TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}">
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" >
                <Setter Property="FontWeight" Value="Normal" >
                <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                                <Setter Property="FontWeight" Value="Bold">
                        </Trigger>
                </Style.Triggers>
        </Style>
</TreeView.ItemContainerStyle>

在MSDN Forum上溜达了一圈,因为对这个问题的描述很难,所以没有找到有效的Post。无奈,只得仔细看DataGridRow和TreeViewItem的文档,没想到,“踏破铁鞋无觅处得来全不费工夫”:

TreeViewItem定义了Properties: ItemContainerStyle, ItemContainerStyleSelector; DataGrid定义了Properties: RowStyle, RowStyleSelector; DataGridRow定义了RowDetailTemplate, RowDetailTemplateSelector;

由此衍生去StyleSelector和DataTemplateSelector两个Class。至于怎么从这两个类去派生,怎么写对应的XAML,不值一哂,更何况MSDN还有个强大的搜索框。

是为之记。 Alva Chien 2010.10.14