2010-10-25 98 views
0

我需要將分組應用於嵌套在TabControl中的DataGrid中的行。數據綁定DataGridTabControl。最外層的控件綁定到一個ViewModel,它暴露了綁定到TabControl的頁面集合。每個頁面都會顯示一組綁定到Grid的行。WPF分組嵌套在數據綁定選項卡中的DataGrid

我試圖按照this one from SOthis one from C-SharpCorner這樣的模式。我沒有結婚,所以如果有更好的模式(as this post seems to indicate),我願意走向另一個方向。

現在,我不知道在哪裏注入PropertyGroupDescription的定義,並將其綁定到我想要的PropertyName。我嘗試過將它作爲資源並直接作爲DataGrid上的CollectionViewSource。但都沒有產生合理的結果。

這是我到目前爲止有:

<UserControl x:Class="View.ViewInvoiceUserControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" > 
<Grid Name="_grid" MinHeight="100"> 

剪斷,爲了清晰...

<TabControl 
    ItemsSource="{Binding Path=CurrentInvoice.InvoicePages}" 
    Grid.Column="0" 
    Grid.ColumnSpan="4" 
    Grid.Row="5" 
    HorizontalAlignment="Left" 
    Margin="0,4,0,0" 
    Name="_invoicePageTabControl" 
    VerticalAlignment="Top"> 
    <TabControl.ItemContainerStyle /> 
     <TabControl.ContentTemplate> 
      <DataTemplate> 
       <DataGrid 
        Name="_invoiceLineGrid" 
        AutoGenerateColumns="False" 
        CanUserSortColumns="True" 
        ColumnHeaderStyle="{StaticResource columnHeaderStyle}" 
        HorizontalAlignment="Left" 
        ItemsSource="{Binding InvoiceLines}" 
        IsReadOnly="True" 
        RowDetailsVisibilityMode="VisibleWhenSelected" 
        RowStyle="{StaticResource DataGridRowStyle}" 
        SelectionUnit="FullRow" 
        VerticalAlignment="Top" 
        Visibility="{Binding Path=InvoiceLineGridVisibility}" 
        Initialized="_invoiceLineGrid_Initialized"> 
        <DataGrid.Columns> 
         <DataGridTextColumn Header="Line Number" MinWidth="50" Binding="{Binding InvoiceLineNumber}" /> 
         <DataGridTextColumn Header="Description" MinWidth="50" Width="*" Binding="{Binding Description}" /> 
         <DataGridTextColumn Header="Quantity" MinWidth="50" Binding="{Binding Quantity}" /> 
         <DataGridTextColumn Header="Extended Cost" MinWidth="50" Width="*" Binding="{Binding ExtendedCost}" /> 
        </DataGrid.Columns> 
        <DataGrid.GroupStyle> 
         <GroupStyle> 
          <GroupStyle.ContainerStyle> 
           <Style TargetType="{x:Type GroupItem}"> 
            <Setter Property="Template"> 
             <Setter.Value> 
              <ControlTemplate TargetType="{x:Type GroupItem}"> 
               <Expander> 
                <Expander.Header> 
                 <StackPanel> 
                  <TextBlock Text="{Binding Name}" /> 
                 </StackPanel> 
                </Expander.Header> 
                <ItemsPresenter /> 
               </Expander> 
              </ControlTemplate> 
             </Setter.Value> 
            </Setter> 
           </Style> 
          </GroupStyle.ContainerStyle> 
         </GroupStyle> 
        </DataGrid.GroupStyle> 
       </DataGrid> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 
    </TabControl> 
</Grid> 
</UserControl> 

我想我需要添加類似:

<CollectionViewSource> 
    <CollectionViewSource.GroupDescriptions> 
     <PropertyGroupDescription PropertyName="DepartmentBillingCode" /> 
    </CollectionViewSource.GroupDescriptions> 
</CollectionViewSource> 

如果我添加CollectionViewSource作爲資源並更改DataGrid綁定,網格中沒有行。 如果我添加了CollectionViewSourceDataGrid,我得到一個異常:嵌套在Add value to collection of type 'System.Windows.Controls.ItemCollection' threw an exception. Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead.但我沒有看到一個GroupDescriptionPropertyGroupDescriptionDataGrid.ItemSource

所以,我現在感覺喪失。 任何建議表示讚賞。

謝謝

+0

@ГеоргийЛанец,感謝您的編輯。很高興看到老問題得到一點關注。 – 2015-12-02 22:31:07

+0

保羅,你的歡迎。我喜歡將代碼帶入完美。這就是爲什麼我總是在採取最後期限。 – 2015-12-02 22:57:00

回答

1

所以我找到了一個可能的答案。我接受其他人的解釋。這是一個好的解決方案嗎?

應用SO post regarding what part of MVVM pattern is resonsible for grouping of DataGrid,我去尋找一個解決方案來在ViewModel中生成一個分組。我在WpfTutorial.com

上找到一個簡單的例子In InvoicePageViewModel,我創建了一個新的屬性,從我的列表中創建一個ListViewCollection。 ListViewCollection讓我添加自己的GroupDescription如下:

public ListCollectionView GroupedInvoiceLines 
    { 
     get 
     { 
      ListCollectionView groupedLines = new ListCollectionView(InvoiceLines); // TODO should this be cached? 

      groupedLines.GroupDescriptions.Add(new PropertyGroupDescription("DepartmentBillingCode")); 

      return groupedLines; 
     } 
    } 

然後,它是微不足道的更改數據從InvoiceLines到GroupedInvoiceLines在DataGrid上綁定。

評論?有問題嗎?