2017-02-15 169 views
1

我有一個DataGrid有2個固定列,可以排序沒有任何問題。如何啓用在WPF中以編程方式添加DataGridTextColumn的排序?

  <DataGrid Name="SelectedObjectsGrid" 
         Visibility="{Binding ShowSelectedObjectsInfoPanel, Converter={StaticResource BoolNegationToVisibilityConverter}}" 
         ItemsSource="{Binding SelectedObjectItems}" 
         SelectionMode="Extended" 
         CanUserAddRows="False" 
         AutoGenerateColumns="False" 
         VirtualizingPanel.IsVirtualizing="True" 
         VirtualizingPanel.IsVirtualizingWhenGrouping="True" 
         VirtualizingPanel.VirtualizationMode="Standard" 
         IsReadOnly="True" 
         Grid.Row="0" Margin="0,0,4,0"> 
       <DataGrid.RowStyle> 
        <Style TargetType="DataGridRow" BasedOn="{StaticResource Theme.DataGrid.Row.Style}"> 
         <Setter Property="ContextMenu" Value="{StaticResource SelectedObjectRowContextMenu}" /> 
         <EventSetter Event="MouseDoubleClick" Handler="SelectedObjectsRow_DoubleClick" /> 
        </Style> 
       </DataGrid.RowStyle> 
       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="SelectionChanged"> 
         <i:InvokeCommandAction Command="{ui:CommandHandler ObjectsGridSelectionChangedCommand}" CommandParameter="{Binding SelectedItems,ElementName=SelectedObjectsGrid}"> 
         </i:InvokeCommandAction> 
        </i:EventTrigger> 
       </i:Interaction.Triggers> 
       <DataGrid.GroupStyle> 
        <!-- Style for groups at top level. --> 
        <GroupStyle> 
         <GroupStyle.ContainerStyle> 
          <Style TargetType="{x:Type GroupItem}"> 
           <Setter Property="Margin" Value="0,0,0,5"/> 
           <Setter Property="Template"> 
            <Setter.Value> 
             <ControlTemplate TargetType="{x:Type GroupItem}"> 
              <Expander IsExpanded="{Binding Path=Name.IsExpanded}" 
                 Tag="{Binding Path=Name}" 
                 Background="#FF112255" BorderBrush="#FF002255" 
                 Foreground="#FFEEEEEE" BorderThickness="1,1,1,5"> 
               <Expander.ContextMenu> 
                <ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"> 
                 <MenuItem Header="{DynamicResource XpStrKeepSelectionTableShort}" Command="{ui:CommandHandler KeepTable}" CommandParameter="{Binding Name}" /> 
                 <MenuItem Header="{DynamicResource XpStrRemoveSelectionTableShort}" Command="{ui:CommandHandler RemoveTable}" CommandParameter="{Binding Name}" /> 
                 <Separator/> 
                 <MenuItem Header="{DynamicResource XpStrList}" Command="{ui:CommandHandler ToggleSelectedObjectsGrouping}" CommandParameter="False" > 
                  <MenuItem.Icon> 
                   <Image> 
                    <Image.Source> 
                     <DrawingImage> 
                      <DrawingImage.Drawing> 
                       <GeometryDrawing Brush="Black" Geometry="{Binding DataContext.AreSelectedObjectsGroupedByTable, 
                        Source={x:Reference SelectedObjectsGrid}, Converter={StaticResource BoolNegationToGeometryConverter}}" /> 
                      </DrawingImage.Drawing> 
                     </DrawingImage> 
                    </Image.Source> 
                   </Image> 
                  </MenuItem.Icon> 
                 </MenuItem> 
                 <MenuItem Header="{DynamicResource XpStrGroups}" Command="{ui:CommandHandler ToggleSelectedObjectsGrouping}" CommandParameter="True" > 
                  <MenuItem.Icon> 
                   <Image> 
                    <Image.Source> 
                     <DrawingImage> 
                      <DrawingImage.Drawing> 
                       <GeometryDrawing Brush="Black" Geometry="{Binding DataContext.AreSelectedObjectsGroupedByTable, 
                        Source={x:Reference SelectedObjectsGrid}, Converter={StaticResource BoolToGeometryConverter}}" /> 
                      </DrawingImage.Drawing> 
                     </DrawingImage> 
                    </Image.Source> 
                   </Image> 
                  </MenuItem.Icon> 
                 </MenuItem> 
                 <Separator Visibility="{Binding DataContext.AreSelectedObjectsGroupedByTable, Source={x:Reference SelectedObjectsGrid}, Converter={StaticResource BoolToVisibilityConverter}}" /> 
                 <MenuItem Header="{DynamicResource XpStrHintTreeExpandAll}" Command="{ui:CommandHandler ExpandOrCollapseAll}" CommandParameter="True" 
                    Visibility="{Binding DataContext.SelectedObjectsGroupHeaders.DoCollapsedGroupsExist, 
                  Source={x:Reference SelectedObjectsGrid}, Converter={StaticResource BoolToVisibilityConverter}}"> 
                  <MenuItem.Icon> 
                   <Image Source="{Binding Converter={StaticResource nameToBitmapSource}}" DataContext="BmpTreeExpandAll"/> 
                  </MenuItem.Icon> 
                 </MenuItem> 
                 <MenuItem Header="{DynamicResource XpStrHintTreeCollapseAll}" Command="{ui:CommandHandler ExpandOrCollapseAll}" CommandParameter="False" 
                    Visibility="{Binding DataContext.SelectedObjectsGroupHeaders.DoExpandedGroupsExist, 
                  Source={x:Reference SelectedObjectsGrid}, Converter={StaticResource BoolToVisibilityConverter}}"> 
                  <MenuItem.Icon> 
                   <Image Source="{Binding Converter={StaticResource nameToBitmapSource}}" DataContext="BmpTreeCollapseAll"/> 
                  </MenuItem.Icon> 
                 </MenuItem> 
                </ContextMenu> 
               </Expander.ContextMenu> 
               <Expander.Header> 
                <DockPanel> 
                 <TextBlock FontWeight="Bold" Margin="5,0,0,0" IsHitTestVisible="False"> 
                  <Run Text="{Binding Path=Name.Description, Mode=OneWay}" /> 
                  <Run Text=" ("/> 
                  <Run Text="{Binding Path=Name.GroupedCount, Mode=OneWay}" /> 
                  <Run Text=")"/> 
                 </TextBlock> 
                </DockPanel> 
               </Expander.Header> 
               <Expander.Content> 
                <ItemsPresenter/> 
               </Expander.Content> 
              </Expander> 
             </ControlTemplate> 
            </Setter.Value> 
           </Setter> 
          </Style> 
         </GroupStyle.ContainerStyle> 
        </GroupStyle> 
       </DataGrid.GroupStyle> 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="{DynamicResource XpStrLabel}" Binding="{Binding Data.Label}" SortDirection="Ascending"/> 
        <DataGridTextColumn Header="{DynamicResource XpStrClass}" Binding="{Binding Data.Class.Name}" /> 
       </DataGrid.Columns> 
      </DataGrid> 

當程序正常初始化我撥打下面的方法來補充,不能進行排序動態列:

我有一段代碼,增加了:

private void AddDynamicColumns() 
    { 
     var separator = new char[] {';', ':'}; 
     foreach (var parameter in Parameters.Instance.GetParameters("SelectedObjectsDynField")) 
     { 
      var values = parameter.StringValue.Split(separator); 
      var fieldName = values[0]; 
      var fieldDescr = fieldName; 
      if (values.Length > 1) 
       fieldDescr = values[1]; 

      var col = new DataGridTextColumn(); 
      col.CanUserSort = true; 
      col.Header = fieldDescr; 
      var bind = new MultiBinding(); 
      bind.Converter = new NetObjectToPrintableFieldValueConverter(); 
      bind.Bindings.Add(new Binding("Data")); 
      bind.Bindings.Add(new Binding() { Source = fieldName }); 
      col.Binding = bind; 
      SelectedObjectsGrid.Columns.Add(col); 
     } 
    } 

可能是什麼這是爲什麼?

編輯:添加

col.SortMemberPath = fieldName 

使得它有點工作,但它打破了虛擬化。填充DataGrid現在需要20倍的時間。此外,排序不會正確排序行。單擊第二次動態列將其降序排序不會執行任何操作。

+0

添加的類型實現了「IComparable」嗎? – Ron

+0

列的綁定屬性中的數據是整數或字符串。查看我關於丟失虛擬化和錯誤排序的編輯。 –

+1

這是一個已知的問題。看看是否有幫助:http://stackoverflow.com/a/34864070/5615980 – Ron

回答

1

根據this answer,設置RowHeight使WPF DataGrid在按特定列排序時不會丟失虛擬化。

+0

謝謝,我只是試過了,但沒有在我的數據網格中的任何影響。 .NET Framework 4.5.1的高度受到影響,但虛擬化仍然丟失 –

相關問題