2014-01-14 3 views
0

Я новичок и смущен некоторым синтаксисом ListBox.GroupStyle. Код:Что означает Binding Path = Имя в WPF?

<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 Имя} делает то заголовок отображается "True" или "False", и почему {Binding B} не работает? Что означает «Имя», поскольку класс не имеет такого свойства.

ответ

3

Если вы проверяете приложение с помощью Snoop, вы будете понимать DataContext вашего TextBlock и это предки вплоть до GroupItem является объектом типа MS.Internal.Data.CollectionViewGroupInternal, который содержит Name свойство:

enter image description here

Вот почему {Binding Name} работает там, а {Binding B} - нет.

+0

+1 Хороший ответ. Я не знал о «Снупе». – gleng

2

Name является собственностью CollectionViewGroup Class, которая по умолчанию DataContext для коллекций, сгруппированных по CollectionView на основе GroupDescriptions.

2

Когда вы используете группировку DataContext каждой группы, будет установлен экземпляр CollectionViewGroup, который, кроме Items, хранит некоторую информацию о самой группе. Name будет представлять значение, по которому элементы были сгруппированы. Так что в вашем случае, когда вы делаете:

<PropertyGroupDescription PropertyName="B" /> 

это означает, что создавать различные группы для различных значений B и потому, что из Boolean типа это означает, что есть только две группы возможных. Один для B == true и второй для B == false, следовательно текст в заголовке

Смежные вопросы