2014-01-14 11 views
0

나는 초보자이며 ListBox.GroupStyle의 일부 구문을 혼동합니다. 코드 :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; } 
} 

그래서 제 질문은 {이름 바인딩} 왜 아니라 헤더에 "true"또는 "false"왜 작동하지 {B 바인딩}합니까? 클래스 C에는 해당 속성이 없으므로 "이름"은 무엇을 의미합니까?

답변

3

당신이 Snoop를 사용하여 응용 프로그램을 검사하는 경우, 당신은 당신의 TextBlockDataContextGroupItem까지 그것의 조상을 실현하겠습니다은 Name 속성이 포함 유형 MS.Internal.Data.CollectionViewGroupInternal의 대상이다 따라서 {Binding Name}이 작동하며, {Binding B}은 작동하지 않습니다.

+0

+1 좋은 답변입니다. 나는 '스눕 (Snoop)'에 대해 몰랐다. – gleng

2

NameGroupDescriptions에 따라 CollectionView별로 그룹화 컬렉션의 기본 DataContext입니다 CollectionViewGroup Class의 속성입니다.

enter image description here

:

2

그룹을 사용할 때 각 그룹의 DataContextCollectionViewGroup의 인스턴스로 설정되며이 그룹은 Items을 제외하고 그룹 자체에 대한 정보를 저장합니다. Name은 항목이 그룹화 된 값을 나타냅니다. 당신이 할 때 귀하의 경우 그래서 :

<PropertyGroupDescription PropertyName="B" /> 

당신이 B의 서로 다른 값에 대해 서로 다른 그룹을 만들 수 있다는 것을 의미하고 그것은 Boolean 유형이기 때문에 그것은 가능한 단지 2 그룹이 있다는 것을 의미한다. 하나는 B == true이고 다른 하나는 B == false입니다. 따라서 머리글에 텍스트가 표시됩니다.