2014-08-25 2 views
2

Я ищу лучший способ обновить GroupStyle.WPF update ContainerStyleSelector style selection

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> 

Я wan't, чтобы вызвать выбор в GroupStyleSelector снова, когда что-то меняется, например, когда элемент удаляется или добавляется из группы.

любая идея, как это можно сделать?

FYI, я подумал о подтасовке что-то с помощью AttachedProperty Bound на каждом GroupItem

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

Как насчет создания привязки данных к свойству ItemsSource .Count. Всякий раз, когда он изменяется, вы применяете свой групповой стиль к древовидной структуре, он должен обновляться каждый раз. Я думал о том, что для ContainerStyleSelector зависит от указанного свойства Count, но, к сожалению, это не свойство DP, поэтому привязка не разрешена. – Maximus

+0

Есть несколько групп, каждый из которых нуждается в повторном выборе его группового стиля, возможно, я постараюсь сделать это для постоянного группового стиля, который изменит его шаблон и свойства оратора по тиграм. –

ответ

0

Для начала я посмотрел на CollectionViewGroup с помощью отражателя.

CollectionViewGroup - это DataContext, применяемый CollectionViewSource к GroupItem GroupItem, который он создает.

Свойство 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>