2

我正在寻找更新 GroupStyle 的最佳方法。

CS :

我有一个 GroupStyleSelector(简体):

public class CountBasedGroupStyleSelector : StyleSelector
{
    public Style SingleItemGroupStyle { get; set; }
    public Style MultipleItemGroupStyle { get; set; }

    public override Style SelectStyle(object item, DependencyObject container)
    {           
        var group = item as CollectionViewGroup;

        return group.ItemCount == 1 ? SingleItemGroupStyle : MultipleItemGroupStyle;
    }   
}

XAML:

<tsk:CountBasedGroupStyleSelector x:Key="groupStyleSelector" SingleItemGroupStyle="{StaticResource SingleItemGroupStyle}" 
                        MultipleItemGroupStyle="{StaticResource MultipleItemGroupStyle}" />

    <TreeView>          
        <TreeView.GroupStyle>               
            <GroupStyle x:Name="groupStyle" ContainerStyleSelector="{StaticResource groupStyleSelector}"  />                    
        </TreeView.GroupStyle>              
    </TreeView>

当某些事情发生变化时,例如从组中删除或添加项目时,我不想再次触发 GroupStyleSelector 的选择。

任何想法如何做到这一点?

仅供参考,我想在每个 GroupItem 上使用 AttachedProperty Bound 来装配一些东西

GroupItemStyles:(简化)

   <Style x:Key="MultipleItemGroupStyle" TargetType="GroupItem">
        <Setter Property="Padding" Value="0,0,1,0" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="GroupItem">
                    <Grid>                  
                        <Border Margin="{TemplateBinding Padding}" x:Name="grpOverlayBd" CornerRadius="4" Background="#FFAAAAAA" BorderThickness="0" BorderBrush="Transparent" >
                            <ItemsPresenter />                                  
                        </Border>                                                                           
                    </Grid>                                                                     
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style x:Key="SingleItemGroupStyle" TargetType="GroupItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="GroupItem">
                    <ItemsPresenter />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
4

1 回答 1

0

对于初学者,我使用反射器查看了 CollectionViewGroup 。

CollectionViewGroup是 CollectionViewSource 应用于它创建的GroupItem GroupItem 的 DataContext。

它有一个 ItemsCount 属性并实现了 INotifyPropertyChanged。

例如,所有只包含一个项目的项目现在都是红色的。

        <TreeView>              
            <TreeView.GroupStyle>               

                <GroupStyle>
                    <GroupStyle.ContainerStyle>
                        <Style TargetType="GroupItem">                                                      
                            <Setter Property="Background" Value="#FFAAAAAA" />
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="GroupItem">
                                        <Grid>                  
                                            <Border Background="{TemplateBinding Background}" >
                                                <ItemsPresenter />                                  
                                            </Border>                                                                           
                                        </Grid>                                                                     
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>

                            <Style.Triggers>
                                <DataTrigger Binding="{Binding ItemCount, Mode=OneWay}" Value="1">
                                    <Setter Property="Background" Value="Red" />
                                </DataTrigger>
                            </Style.Triggers>

                        </Style>
                    </GroupStyle.ContainerStyle>
                </GroupStyle>

            </TreeView.GroupStyle>

        </TreeView>
于 2014-08-25T11:13:10.730 回答