2010-01-27 21 views
9

içinden akım öğeye bağlanması Ben gruplandırılmış DataGrid (WPF araç versiyonu) oluşturmak çalışıyorumWPF - grup başlığı tarzı

böylece ;-) bana sakin ol lütfen bir WPF noob şey değilim. Veri kaynağını başarıyla oluşturdum, DataGrid'in kendisi, gerekli CollectionViewSource ve grup başlığı için Stil (bir genişletici kullanan).

'Assign_To' adlı bir özelliğe göre gruplamak istiyorum ve ilgili değer (gruplanmış öğelerin paylaştığı değer) başlığında görünmesini istiyorum. Ancak, Assign_To özelliğini döndürmek için mevcut gruba/maddeye nasıl bağlanacağımı bilemiyorum.

Sahip olduğum en yakın (aşağıdaki), Assign_To için sabit bir değer döndüren genel CollectionViewSource'a bağlanıyor. 'Assign_To' için doğru değeri döndürmek için mevcut öğeye/gruba bağlanmanın uygun yolu ne olurdu? Birisi yardımcı olabilir

Umut. Teşekkürler!

Andy T.

İşte

<Window DataContext="{Binding Source={StaticResource SampleDataSource}}" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    x:Class="DataGridTest.MainWindow" 
    x:Name="Window" 
    Title="MainWindow" 
    Width="640" Height="480" mc:Ignorable="d"> 

    <Window.Resources> 
     <CollectionViewSource x:Key="CVS" Source="{Binding MyData}"> 
      <CollectionViewSource.GroupDescriptions> 
       <PropertyGroupDescription PropertyName="Assign_To"/> 
      </CollectionViewSource.GroupDescriptions> 
     </CollectionViewSource> 

     <Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type GroupItem}"> 
         <Expander IsExpanded="True"> 
          <Expander.Header> 
           <StackPanel Orientation="Horizontal"> 
            <TextBlock Text="Assign To: "/> 
            <TextBlock Text="{Binding Source={StaticResource CVS}, Path=Assign_To}"/> 
           </StackPanel>        
          </Expander.Header> 
          <ItemsPresenter/> 
         </Expander> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

    </Window.Resources> 


    <Grid x:Name="LayoutRoot"> 
     <dg:DataGrid 
     ItemsSource="{Binding Source={StaticResource CVS}}" 
     SelectionUnit="CellOrRowHeader" 
     CanUserAddRows="False" 
     CanUserDeleteRows="False" 
     CanUserResizeRows="False"> 
     <dg:DataGrid.GroupStyle> 
      <GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}"> 
       <GroupStyle.Panel> 
        <ItemsPanelTemplate> 
         <dg:DataGridRowsPresenter/> 
        </ItemsPanelTemplate> 
       </GroupStyle.Panel> 
      </GroupStyle> 
     </dg:DataGrid.GroupStyle>   
     </dg:DataGrid> 
    </Grid> 
</Window> 

cevap

18

teşekkürler. Gerçekten takdir ediyorum ve işe yarayıp yaramadığını kontrol edeceğim. Her neyse, ortaya çıktığı gibi, bazı poking ve prodding sonrasında, sadece XAML kullanarak çalıştım. Eksik olan şey, grup üstbilgisinin bağlı olduğu her öğenin bir GroupItem olması ve GroupItem'un varsayılan DataContext'inin bir CollectionViewGroup olmasıdır. Buna karşılık, bir CollectionViewGroup topluluğudur bir Öğeler özelliğine sahiptir ve bu nedenle koleksiyonunda ilk öğenin Assign_To değeri elde ve benim başlık metninde kullanabiliriz. Şunun gibi:

<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type GroupItem}"> 
         <Expander IsExpanded="True"> 
          <Expander.Header> 
           <StackPanel Orientation="Horizontal"> 
            <TextBlock Text="Assign To: "/> 
            <TextBlock Text="{Binding Items[0].Assign_To}"/> 
           </StackPanel>  
          </Expander.Header> 
          <ItemsPresenter/> 
         </Expander> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
5

bağlanma ayarları Assign_To mülkiyet türüne bağlıdır ... kaynağıdır. Muhtemelen sizin için çalışabilecek en basit ayarlar:

, aşağıdaki örneklerin sizin için çalışıp çalışmadığını kontrol ediniz; Ayrıca bu bağlantıyı WPF Toolkit DataGrid Part IV: TemplateColumns and Row Grouping Eğer

kodu için yararlı olabilir:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     var dataProvider = (CollectionViewSource)FindResource("CVS"); 
     dataProvider.Source = Test.GetTests(); 
    } 
} 

public class Test 
{ 
    public string Assign_To { get; set; } 
    public string Test0 { get; set; } 
    public int  Test1 { get; set; } 

    public static List<Test> GetTests() 
    { 
     List<Test> tests = new List<Test>(); 

     tests.Add(new Test { Assign_To = "a", Test0 = "aaaa", Test1 = 1 }); 
     tests.Add(new Test { Assign_To = "a", Test0 = "bbbb", Test1 = 1 }); 
     tests.Add(new Test { Assign_To = "b", Test0 = "cccc", Test1 = 2 }); 

     return tests; 
    } 
} 

xaml: Cevabınız için

<Window.Resources>  
    <CollectionViewSource x:Key="CVS" > 
     <CollectionViewSource.GroupDescriptions> 
      <PropertyGroupDescription PropertyName="Assign_To"/> 
     </CollectionViewSource.GroupDescriptions> 
    </CollectionViewSource> 

    <Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type GroupItem}"> 
        <Expander IsExpanded="True"> 
         <Expander.Header> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="Assign To: "/> 
           <TextBlock Text="{Binding Name}"/> 
          </StackPanel> 
         </Expander.Header> 
         <ItemsPresenter /> 
        </Expander> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style>  
</Window.Resources> 

<Grid>   
    <DataGrid 
     ItemsSource="{Binding Source={StaticResource CVS}}"    
     HorizontalScrollBarVisibility="Hidden" SelectionMode="Extended" 
     AutoGenerateColumns="False" 
     Name="dataGrid1">  
     <DataGrid.GroupStyle> 
      <GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}"> 
       <GroupStyle.Panel> 
        <ItemsPanelTemplate> 
         <DataGridRowsPresenter/> 
        </ItemsPanelTemplate> 
       </GroupStyle.Panel> 
      </GroupStyle> 
     </DataGrid.GroupStyle>  
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Test0" Binding="{Binding Path=Test0}" /> 
      <DataGridTextColumn Header="Test1" Binding="{Binding Path=Test1}" /> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 
+0

yapacak tüm güncel grubunu-by gösterilecek olan Oldukça emin ' koleksiyonunda yatan öğe ile yapılacak' değildir şey – MickyD