2010-01-27 59 views
9

內綁定到當前項目我是一個WPF小白的東西,所以請把我很容易;-)WPF - 從組頭風格

我試圖創建分組數據網格(WPF工具包的版本)。 我已成功創建數據源,DataGrid本身,所需的CollectionViewSource和組標題(使用擴展器)的樣式。

我想通過名爲'Assign_To'的屬性進行分組,並且在標題中顯示相關值(分組項共享的值)。但是,我無法解決如何綁定到當前的組/項目以返回其Assign_To屬性。

我得到的最接近的(如下所示)綁定到整個CollectionViewSource,它爲Assign_To返回一個固定值。爲了返回'Assign_To'的正確值,綁定到當前項目/組的正確方法是什麼?

希望有人能幫忙。謝謝!

安迪T.

這裏的源...

<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> 

回答

18

感謝您的答覆。我真的很感激它,並會檢查它是否有效。

無論如何,事實證明,經過一些戳動和刺激後,我只用XAML完成了它。我一直想念的是這樣的事實,即組標題綁定的每個項目是GroupItem並且GroupItem的默認DataContext是CollectionViewGroup。反過來,CollectionViewGroup有一個項目屬性,這是一個集合,因此我可以得到Assign_To值集合中的第一個項目,並在我的標題文本中使用它。像這樣:

<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

綁定設置取決於Assign_To屬性的類型。最簡單的設置可能會爲你工作將是:

<TextBlock Text="Assign To: "/> 
<TextBlock Text="{Binding Name}"/> 

請檢查下面的例子是否適合你;在這個連接WPF Toolkit DataGrid Part IV: TemplateColumns and Row Grouping可能是

你的代碼幫助:

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:

<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

很確定所有會做的事情是在中顯示當前的group-by與集合中底層項目無關 – MickyD 2018-02-26 04:29:49