【问题标题】:What does Binding Path=Name mean in WPF?WPF 中的 Binding Path=Name 是什么意思?
【发布时间】:2014-01-14 16:08:12
【问题描述】:

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

【问题讨论】:

    标签: c# wpf binding collectionviewsource groupstyle


    【解决方案1】:

    如果您使用Snoop 检查应用程序,您会发现TextBlock 的DataContext 和GroupItem 的祖先是MS.Internal.Data.CollectionViewGroupInternal 类型的对象,其中包含Name属性:

    这就是为什么{Binding Name} 可以在其中工作,而{Binding B} 不能。

    【讨论】:

      【解决方案2】:

      Name 是CollectionViewGroup Class 的一个属性,它是基于GroupDescriptions 由CollectionView 分组的集合的默认DataContext。

      【讨论】:

        【解决方案3】:

        当您使用分组时,每个组的DataContext 将被设置为CollectionViewGroup 的一个实例,除了Items,它还存储有关组本身的一些信息。 Name 将表示项目已分组的值。因此,当您这样做时:

        <PropertyGroupDescription PropertyName="B" />
        

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

        【讨论】:

          猜你喜欢
          • 2010-11-07
          • 2013-01-04
          • 2014-03-19
          • 2011-04-21
          • 1970-01-01
          • 1970-01-01
          • 2012-02-16
          • 2022-10-18
          • 2010-11-16
          相关资源
          最近更新 更多