2017-02-15 3 views
1

私は問題なくソートできる2つの固定列を持つDataGridを持っています。プログラムが正しく、私はソートすることができない動的な列を追加するには、以下のメソッドを呼び出す初期化され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); 
     } 
    } 

何ができますかこれの理由?

EDIT:

col.SortMemberPath = fieldName 

を追加するには、それがやや仕事になりますが、それは、仮想化を破ります。 DataGridには20倍の時間がかかります。また、ソートでは行が正しくソートされません。 2回目の動的列をクリックすると降順で並べ替えることは何もしません。

+0

追加された型は '' IComparable''を実装していますか? – Ron

+0

列のバウンドプロパティのデータは、整数または文字列のいずれかです。仮想化の喪失と誤った並べ替えについての私の編集を参照してください。 –

+1

これは既知の問題です。これが役立つかどうかを確認してください:http://stackoverflow.com/a/34864070/5615980 – Ron

答えて

1

this answerに基づいて、RowHeightを設定すると、WPF DataGridは特定の列でソートされると仮想化が失われなくなります。

+0

ありがとう、私はそれを試みたが、私のDataGridには何の効果もありませんでした。高さに影響はありましたが、.NET Framework 4.5.1では仮想化はまだ失われていました –

関連する問題