简体   繁体   English

WPF更新ContainerStyleSelector样式选择

[英]WPF update ContainerStyleSelector style selection

I'm looking for the best way to update a GroupStyle . 我正在寻找更新GroupStyle的最佳方法。

CS : CS:

I Have a GroupStyleSelector (Simplified) : 我有一个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 : 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>

I wan't to trigger the GroupStyleSelector's selection again when something changes , for example when an item is removed or add from a group . 当某些更改(例如,从组中删除或添加项目)时,我不会再次触发GroupStyleSelector的选择。

any idea's how this can be done ? 任何想法如何做到这一点?

FYI , i thought of rigging something up using an AttachedProperty Bound on each GroupItem 仅供参考,我想在每个GroupItem上使用AttachedProperty Bound绑定一些东西

GroupItemStyles : (Simplified) 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>

For starters i looked at CollectionViewGroup using reflector . 首先,我使用反射器查看了CollectionViewGroup。

CollectionViewGroup is the DataContext applied by CollectionViewSource to a GroupItem GroupItem it creates. CollectionViewGroupCollectionViewSource应用于它创建的GroupItem GroupItem的DataContext。

It has a ItemsCount property and it implements INotifyPropertyChanged. 它具有ItemsCount属性,并实现INotifyPropertyChanged。

For example all items containing just one item are now red . 例如,所有仅包含一项的项目现在变为红色。

        <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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM