2014-01-14 73 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; } 
} 

所以我的問題是,爲什麼只有當{結合名稱}做標題顯示「真」或「假」的,爲什麼{結合}不行? 「名稱」是什麼意思,因爲C類沒有這樣的屬性

回答

3

如果檢查使用Snoop的應用程序,你會發現你的TextBlockDataContext和它的祖先一直到GroupItemMS.Internal.Data.CollectionViewGroupInternal類型的對象,其中包含一個Name屬性:

enter image description here

這就是爲什麼{Binding Name}在那裏工作,而{Binding B}沒有。

+0

+1 Nice answer。我不知道「Snoop」。 – gleng

2

當您使用分組DataContext的每個組將被設置爲CollectionViewGroup的一個實例,該實例除了Items之外還存儲有關該組本身的一些信息。 Name將表示項目被分組的值。所以你的情況,當你做:

<PropertyGroupDescription PropertyName="B" /> 

這意味着您創建的B不同的價值觀不同的羣體和因爲它是一個Boolean型這意味着只有2組可能的。一個用於B == true,另一個用於B == false因此您的標題中的文字