【问题标题】:WPF update ContainerStyleSelector style selectionWPF 更新 ContainerStyleSelector 样式选择
【发布时间】:2014-08-25 07:53:45
【问题描述】:

我正在寻找更新 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>

【问题讨论】:

  • 如何将数据绑定到您的 ItemsSource .Count 属性。每当它更改时,您将组样式应用于树视图,它应该每次都刷新。我正在考虑使 ContainerStyleSelector 依赖于提到的 Count 属性,但不幸的是它不是 DP 属性,因此不允许绑定。
  • 有几个 groupitems 每个都需要重新选择它的 groupstyle ,也许我会尝试为常量 groupstyle 这样做,这会改变它的模板和其他属性。

标签: c# wpf xaml groupstyle


【解决方案1】:

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

CollectionViewGroup是 CollectionViewSource 应用到它创建的 GroupItemGroupItem 的 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 2012-11-20
    • 2020-03-20
    • 2022-11-29
    • 1970-01-01
    • 2011-01-18
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多