绑定路径= WPF中的名称含义是什么?

时间:2014-01-14 16:08:12

标签: c# wpf binding collectionviewsource groupstyle

我是新手,对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类没有这样的属性

3 个答案:

答案 0 :(得分:3)

如果您使用Snoop检查应用程序,您将意识到DataContext的{​​{1}},而GroupItem之前的祖先是{{3}}类型的对象1}},其中包含TextBlock属性:

enter image description here

这就是MS.Internal.Data.CollectionViewGroupInternal在那里工作的原因,而Name没有。

答案 1 :(得分:2)

NameCollectionViewGroup Class的属性,对DataContext根据CollectionView分组的馆藏的默认GroupDescriptions

答案 2 :(得分:2)

当您使用分组时,每个组的DataContext将被设置为CollectionViewGroup的实例,除了Items之外,还存储有关该组本身的一些信息。 Name代表项目分组的价值。所以在你的情况下:

<PropertyGroupDescription PropertyName="B" />

这意味着您为B的不同值创建了不同的组,因为它是Boolean类型,这意味着只有2个组可能。一个用于B == true,第二个用于B == false,因此在标题中显示文字