我是新手,对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类没有这样的属性。
答案 0 :(得分:3)
如果您使用Snoop检查应用程序,您将意识到DataContext
的{{1}},而GroupItem
之前的祖先是{{3}}类型的对象1}},其中包含TextBlock
属性:
这就是MS.Internal.Data.CollectionViewGroupInternal
在那里工作的原因,而Name
没有。
答案 1 :(得分:2)
Name是CollectionViewGroup Class的属性,对DataContext
根据CollectionView
分组的馆藏的默认GroupDescriptions
。
答案 2 :(得分:2)
当您使用分组时,每个组的DataContext
将被设置为CollectionViewGroup
的实例,除了Items
之外,还存储有关该组本身的一些信息。 Name
代表项目分组的价值。所以在你的情况下:
<PropertyGroupDescription PropertyName="B" />
这意味着您为B
的不同值创建了不同的组,因为它是Boolean
类型,这意味着只有2个组可能。一个用于B == true
,第二个用于B == false
,因此在标题中显示文字