0

我是新手,对 ListBox.GroupStyle 的某些语法感到困惑。编码:

    <Window x:Class="testCollectionViewSource.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <CollectionViewSource x:Key="CVS" Source="{Binding Path=Cs}">
                <CollectionViewSource.GroupDescriptions>
                    <PropertyGroupDescription PropertyName="B" />
                </CollectionViewSource.GroupDescriptions>
            </CollectionViewSource>
        </Window.Resources>
        <Grid>
            <ListBox ItemsSource="{Binding Source={StaticResource CVS}}">

                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock   Text="{Binding S}"/>
                    </DataTemplate>
                </ListBox.ItemTemplate>

                <ListBox.GroupStyle>
                    <GroupStyle>
                        <GroupStyle.HeaderTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Name}"/>
                            </DataTemplate>
                        </GroupStyle.HeaderTemplate>
                    </GroupStyle>
                </ListBox.GroupStyle>

            </ListBox>

        </Grid>
    </Window>

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Cs = new ObservableCollection<C>();
        Cs.Add(new C(true, "1"));
        Cs.Add(new C(false, "2"));
        Cs.Add(new C(true, "3"));
        Cs.Add(new C(false, "4"));
        DataContext = this;
    }

    public ObservableCollection<C> Cs { get; set; }
}

public class C
{
    public C(bool b, string s)
    {
        B = b;
        S = s;
    }
    public bool B { get; set; }
    public string S { get; set; }
}

所以我的问题是为什么只有当 {Binding Name } 标题显示“True”或“False”时,为什么 {Binding B } 不起作用?“名称”是什么意思,因为C 类没有这样的属性

4

3 回答 3

4

如果你使用Snoop检查应用程序,你会发现DataContext你的TextBlock和它的祖先GroupItem是一个 type 的对象MS.Internal.Data.CollectionViewGroupInternal,它包含一个Name属性:

在此处输入图像描述

这就是为什么{Binding Name}在那里工作,而{Binding B}没有。

于 2014-01-14T16:24:37.193 回答
2

NameCollectionViewGroup 类的一个属性,它DataContextCollectionView基于GroupDescriptions.

于 2014-01-14T16:17:14.767 回答
2

当您使用分组DataContext时,每个组将被设置为一个实例,CollectionViewGroup其中除了Items存储有关组本身的一些信息。Name将表示项目已分组的值。所以在你的情况下,当你这样做时:

<PropertyGroupDescription PropertyName="B" />

这意味着您为不同的值创建不同的组,B并且因为它是一种Boolean类型,这意味着只有 2 个组可能。一个用于B == true和第二个用于B == false标题中的文本

于 2014-01-14T16:25:10.060 回答