使用扩展器样式绑定到 CollectionViewSource

Binding to a CollectionViewSource with expander style

我有一个 CollectionViewSource 绑定到我的 ViewModelsObservableCollection。然后我在 GroupItem 上有一个 style,里面有一个 expander。我希望能够在组 headers 上有一个 'collapse all' 和一个 'expand all',但是我无法绑定到 expander 上的 isExpanded ControlTemplate。我有这个代码:

      <Style x:Key="GroupStyle" TargetType="{x:Type GroupItem}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GroupItem}">
                        <Expander IsExpanded="{Binding Path=**????**}" Template="{StaticResource DAExpander}">
                            <Expander.Header>
                                <DockPanel VerticalAlignment="Center">
                                    <Image DockPanel.Dock="Left" x:Name="scItemIcon" Source="./groupIcon.ico" Height="18" Width="18"/>
                                    <TextBlock DockPanel.Dock="Left" Text="{Binding Name}"  VerticalAlignment="Center"  Margin="4,0,6,0" />
                                </DockPanel>
                            </Expander.Header>
                            <ItemsPresenter />
                        </Expander>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

我的视图模型上有一个 IsExpanded 属性,但我不知道如何访问它。我找到了这样的例子:

<Expander IsExpanded="{Binding Path=Items[0].IsExpanded}" 
<Expander IsExpanded="{Binding Path=Name.IsExpanded}" 

None 其中似乎有效。有没有办法做到这一点,还是我需要采取不同的方法?

编辑:更多xaml,查看模型代码:

           <ListBox  ItemsSource="{Binding Source={StaticResource MyCVS}}" ItemTemplate="{StaticResource ItmesTemplate}" ItemContainerStyle="{StaticResource ItemChildStyle}" SelectedItem="{Binding SelectedItem}" >
                <ListBox.GroupStyle>
                    <GroupStyle ContainerStyle="{StaticResource GroupStyle}" />
                    <GroupStyle ContainerStyle="{StaticResource Group2Style}" />
                </ListBox.GroupStyle>
            </ListBox>



public class ItemViewModel : ViewModelBase
    {   
        public string GroupName { get; set; }
        public string SubGroupName{ get; set; }
        public string ItemName { get; set; }
        public bool IsExpanded {get; set;}
    }

我在没有绑定的情况下解决了这个问题,方法是在我的 'Expand all' 按钮上添加一个点击事件

private void expandAll_Click(object sender, EventArgs e)
{
    // get each listBoxItem by index from the listBox
    for (int i = 0; i < MyListBox.Items.Count; i++)
    {
        ListBoxItem item = (ListBoxItem)MyListBox.ItemContainerGenerator.ContainerFromIndex(i);

        // find its parents expander
        var exp = FindParent<Expander>(item);

        if (exp != null)
        {
            //if its not null expand it and see if it has a parent expander
            exp.IsExpanded = true;
            exp = FindParent<Expander>(exp);
            if (exp != null)
                exp.IsExpanded = true;
        }

    }
}

FindParent 函数是一个帮助程序,它沿着可视树向上查找指定的控件,从您传入的控件开始。