2010-10-24 12 views
5

Dans le contrôle DataGrid de WPF, si vous définissez une colonne à l'un des types de colonne par défaut (comme DataGridTextColumn ou DataGridCheckBoxColumn), trier sur cette colonne, puis modifier sa valeur, la grille sera automatiquement re-trié. Toutefois, si vous utilisez un DataGridTemplateColumn (et autorisez le tri de la colonne), il peut être trié, mais la modification de la valeur d'une cellule dans cette colonne n'entraîne pas de nouveau tri de la grille. Comment puis-je l'amener à déclencher automatiquement un nouveau tri?WPG DataGrid: automatiquement re-trier sur un DataGridTemplateColumn

XAML:

<DataGrid Name="grid" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
    <DataGridTextColumn Header="First name" Binding="{Binding First}"/> 
    <DataGridTemplateColumn Header="Last name" SortMemberPath="Last"> 
     <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Last}"/> 
     </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid>

Reliure:

ObservableCollection items = new ObservableCollection(); 
grid.ItemsSource = items; 
items.Add(new Character() { First = "Homer", Last = "Simpson" }); 
items.Add(new Character() { First = "Kent", Last = "Brockman" }); 
items.Add(new Character() { First = "Montgomery", Last = "Burns" });

Voilà ma classe de produit, juste au cas où est pertinent:

public class Character : INotifyPropertyChanged { 
    private string first, last; 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void Notify(string name) { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 
    public string First { get { return first; } set { first = value; Notify("First"); } } 
    public string Last { get { return last; } set { last = value; Notify("Last"); } } 
}
+0

semble fonctionner très bien pour moi. Voulez-vous dire que vous modifiez la valeur SortMemberPath pour DataGridTemplateColumn? –

+1

Il trie lorsque vous cliquez dessus explicitement, ou lorsque vous modifiez la valeur de la colonne Prénom, mais ne réorganise pas lorsque vous modifiez la valeur de la colonne Nom. Définir SortMemberPath lui permet de trier, mais ne le fait pas * automatiquement * re-trier, d'où le problème. –

+0

Dans cette situation, j'ai observé les modifications d'une propriété nécessaire et appelé SomeCollectionViewOfGrid.Refresh(); – vorrtex

Répondre

4

Je cherche aussi la réponse à cette . J'ai trouvé une solution: (pas satisfait mais ...)

Lorsque votre collection est mise à jour, vous pouvez le faire:

SortDescription sortDescription = grdData.Items.SortDescriptions[0]; 
grdData.ItemsSource = null; 
grdData.ItemsSource = Data; 
grdData.Items.SortDescriptions.Add(sortDescription); 

laid, mais il fonctionne. Vous voudrez stocker toute la collection contrairement à mon exemple qui ne fait que le premier élément. Un problème avec cela cependant est que le DataGrid perd l'en-tête qui indique le tri, donc bien qu'il recourt correctement l'en-tête de colonne n'est plus sélectionné avec la flèche indiquant la direction du tri.

+0

Pas besoin de réinitialiser 'ItemsSource'. Dans mon application 'SortDescriptions.Clear();' fonctionne à la place parfaitement. –

0

J'avais un DataGrid en C# WPF sous VS2010 qui ne trierait pas indépendamment des paramètres XAML. Pour une raison quelconque, ce DataGrid masqué (sur un onglet secondaire) rencontrait des problèmes avec l'ordre de tri où le DataGrid principal fonctionnait correctement avec des paramètres similaires. En tant que tel, j'ai dû schématiser le DataGrid. Voici mes notes:

D'abord le XAML pour les deux DataGrids (primaire et secondaire, nous allons seulement être le tri de la deuxième grille « noms étendus »:

 <TabControl Grid.Row="1" Name="tabControl1" VerticalAlignment="Top" Style="{StaticResource Section}" Margin="3" Padding="0" FontFamily="Arial" FontSize="10" BorderThickness="0" > 
      <TabItem Name="tabCommon" Style="{StaticResource NameTab}"> 
       <DataGrid Name="grdCommonNames" SelectionChanged="grdCommonNames_SelectionChanged" PreviewKeyDown="grdCommonNames_PreviewKeyDown" Style="{StaticResource NameListGrid}" Focusable="False"> 
        <DataGrid.Columns> 
         <DataGridTextColumn Binding="{Binding Name, NotifyOnTargetUpdated=True}" Width="SizeToCells" Header="Name" CellStyle="{StaticResource NameListCol}" SortDirection="Ascending" /> 
         <DataGridTextColumn Binding="{Binding Pronunciation, NotifyOnTargetUpdated=True}" Width="SizeToCells" Header="Pronunciation" CellStyle="{StaticResource NameListRightCol}"/> 
        </DataGrid.Columns> 
       </DataGrid> 
      </TabItem> 
      <TabItem Name="tabExtended" Style="{StaticResource NameTab}"> 
       <DataGrid Name="grdExtendedNames" SelectionChanged="grdCommonNames_SelectionChanged" PreviewKeyDown="grdCommonNames_PreviewKeyDown" Style="{StaticResource NameListGrid}" > 
        <DataGrid.Columns> 
         <DataGridTextColumn Binding="{Binding Name, NotifyOnTargetUpdated=True}" Width="SizeToCells" Header="Name" CellStyle="{StaticResource NameListCol}" SortDirection="Descending" SortMemberPath="Name"/> 
         <DataGridTextColumn Binding="{Binding Pronunciation, NotifyOnTargetUpdated=True}" Width="SizeToCells" Header="Pronunciation" CellStyle="{StaticResource NameListRightCol}"/> 
        </DataGrid.Columns> 
       </DataGrid> 
      </TabItem> 
     </TabControl> 

Ensuite, l'extrait de code pour trier la seconde On ne fait que trier la première fois, ce qui explique pourquoi le booléen est ici, de cette façon, si on trie manuellement les autres colonnes, on les conserve même si elles retournent au premier onglet, puis re-visiter le 2ème onglet

Ici, notre première colonne dans la Datagrid est nommée "Nom" L'extrait On Click:

 if (!extendSorted) 
     { 
      SortDescription extSort = new SortDescription("Name", ListSortDirection.Ascending); 
      grdExtendedNames.Items.SortDescriptions.Add(extSort); 
      extendSorted = true; 
     } 

Espérons que quelqu'un d'autre puisse trier leur datagrid via le code. La plupart des autres exemples que nous avons trouvés fonctionnaient bien pour les configurations simples, mais dans cette configuration à onglets dual-dataagrid, le tri était déséquilibré.

0

J'ai rencontré un problème similaire lors de l'insertion d'une nouvelle ligne dans un DataGrid. J'ai résolu ce problème en actualisant les éléments du DataGrid.

dataGrid.Items.Refresh(). Cela restaure aussi le tri.
Ne pas oublier de mettre la SortDirection au DataGridColumn (dans ce cas, il est un DataGridTextColumn)

définition DataGrid:

<DataGrid x:Name="dgCustomers" ItemsSource="{Binding CustomerTable}" AutoGenerateColumns="False" CanUserDeleteRows="True"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Kunden ID" Binding="{Binding Path=KundenID,Mode=TwoWay}" SortDirection="Ascending" /> 
      <DataGridTextColumn Header="Name" Binding="{Binding Path=Kundenname,Mode=TwoWay}"/> 
    </DataGrid.Columns> 
</DataGrid> 

fichier CS:

private void btnSavecustomerChanges_Click(object sender, RoutedEventArgs e) 
{   
    try   
    { 
     BL.UpdateCustomerChanges(); 
     dgCustomers.Items.Refresh(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message, "Fehler beim Speichern", MessageBoxButton.OK, MessageBoxImage.Error); 
    } 
} 
0
If DataGridMain.Items.SortDescriptions.Count > 0 Then 
     Dim vSortDescColl As New SortDescriptionCollection 
     For Each vSortDesc In DataGridMain.Items.SortDescriptions 
      vSortDescColl.Add(vSortDesc) 
     Next 
     DataGridMain.ItemsSource = Nothing 
     DataGridMain.ItemsSource = vCallColl 
     For Each vSortDesc In vSortDescColl 
      DataGridMain.Items.SortDescriptions.Add(vSortDesc) 
      For Each vColumn In DataGridMain.Columns 
       If vColumn.SortMemberPath = vSortDesc.PropertyName Then 
        vColumn.SortDirection = vSortDesc.Direction 
        Exit For 
       End If 
      Next 
     Next 
    End If 
+0

Je vous suggère d'ajouter un petit récit pour préfacer votre code pour expliquer ce que vous faites et pourquoi vous ajoutez cette réponse à une question qui a deux ans. – Rob

4

Je sais que c'est vieux mais j'ai aussi eu ce problème de tri de DataGridTemplateColumn. Cela ne se produit pas sur DataGridTextColumn. La façon dont je le fixe avec la direction de tri intact sur la tête de la colonne est:

// after updating the collection, remove all SortDescription and add'em back. 
SortDescriptionCollection sortDescriptions = new SortDescriptionCollection(); 
foreach (SortDescription sd in dataGrid.Items.SortDescriptions) 
{ 
    sortDescriptions.Add(sd); 
} 
dataGrid.Items.SortDescriptions.Clear(); 

foreach (SortDescription sd in sortDescriptions) 
{ 
    dataGrid.Items.SortDescriptions.Add(sd); 
} 

espoir cela aide les gens.

0

Aucune des réponses de thèses travaillé pour moi en 2016.

Après quelques essayer & erreur je suis venu avec cela et il semble fonctionner très bien:

dataGrid.Items.IsLiveSorting = true;