2013-06-18 6 views
6

Ho problemi con il WPF DataGrid che riorganizza le mie righe quando non lo desidero.DataGrid che effettua indesiderate riorganizzazioni

Passi:

  1. Applicare raggruppamento
  2. Ordina la DataGrid da una colonna con i duplicati all'interno del gruppo
  3. Change una cella non nella colonna ordinata
  4. Osservare che le righe di riordino spostando il editati riga fino alla fine del set di righe con valori corrispondenti nella colonna ordinata

Esempio (Si noti la Ricerca per Cognome):

FirstName | LastName^| Amount 
----------+------------+--------- 
Group:Flinstone 
Fred  | Flinstone | 42 
Wilma  | Flinstone | 22 
Pebbles | Flinstone | 28 
Dino  | Flinstone | 64 

Cambiare quantità di Wilma 22-18 si tradurrà in DataGrid riordinare come segue:

FirstName | LastName^| Amount 
----------+------------+--------- 
Group:Flinstone 
Fred  | Flinstone | 42 
Pebbles | Flinstone | 28 
Dino  | Flinstone | 64 
Wilma  | Flinstone | 18 

Come arresto il DataGrid da riorganizzare le righe come questo?

Nota: il riordinamento indesiderato non si verifica se allo DataGrid non è stato applicato alcun raggruppamento.

Ecco il codice che sto usando:

ViewModel:

public class MainViewModel 
{ 
    public ObservableCollection<Item> Items { get; set; } 
    public ListCollectionView ItemsView { get; set; } 

    public MainViewModel() 
    { 
     Items = new ObservableCollection<Item>(); 
     Items.Add(new Item("Fred", "Flinstone", 42)); 
     Items.Add(new Item("Wilma", "Flinstone", 22)); 
     Items.Add(new Item("Pebbles", "Flinstone", 52)); 
     Items.Add(new Item("Dino", "Flinstone", 52)); 
     Items.Add(new Item("Barney", "Rubble", 32)); 
     Items.Add(new Item("Betty", "Rubble", 62)); 
     Items.Add(new Item("BamBam", "Rubble", 42)); 
     Items.Add(new Item("George", "Jetson", 22)); 
     Items.Add(new Item("Jane", "Jetson", 52)); 
     Items.Add(new Item("Judy", "Jetson", 32)); 
     Items.Add(new Item("Elroy", "Jetson", 62)); 
     Items.Add(new Item("Astro", "Jetson", 42)); 

     ItemsView = new ListCollectionView(Items); 
     ItemsView.GroupDescriptions.Add(new PropertyGroupDescription("LastName")); 
    } 
} 

Vista:

<DataGrid 
    ItemsSource="{Binding ItemsView}"> 
    <DataGrid.GroupStyle> 
     <GroupStyle> 
      <GroupStyle.ContainerStyle> 
       <Style TargetType="{x:Type GroupItem}"> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="{x:Type GroupItem}"> 
           <StackPanel> 
            <TextBlock Text="{Binding Path=Name}" /> 
            <ItemsPresenter /> 
           </StackPanel> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </GroupStyle.ContainerStyle> 
     </GroupStyle> 
    </DataGrid.GroupStyle> 
</DataGrid> 

Modello:

public class Item 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public decimal Amount { get; set; } 

    public Item(string firstName, string lastName, decimal amount) 
    { 
     FirstName = firstName; 
     LastName = lastName; 
     Amount = amount; 
    } 
} 
+0

è possibile mostrare il codice in cui si effettua il cambio (dell'importo di Wilma 22-18)? – DrDev

+0

@DrDev Cambio l'importo di Wilma tramite l'interfaccia utente, non nel codice. –

risposta

0

Non è la soluzione più bella, ma in passato ho aggirato t il suo problema ordinando i dati nella mia fonte di dati, e non in DataGridView. Ho imparato come farlo da this forum. (Ho sempre preferito suggerimenti utili per la codifica)

Spero che questo sia quello che stavi cercando!

MODIFICA: Il penultimo post in basso è quello che funziona effettivamente.

+0

Riesci a riassumere la soluzione trovata nel link? I collegamenti sono molto utili quando si cercano informazioni aggiuntive, ma [da sole non sono buone risposte] (http://meta.stackexchange.com/q/8231/189763). –

+0

Abbastanza giusto. Modificherò la mia risposta quando scenderò dal lavoro. –

0

È possibile sovrascrivere il comportamento di ordinamento predefinito di colonne specifiche (anche quando si fa clic su intestazioni di colonna) utilizzando le proprietà associate, che dovrebbero risolvere il problema. Con questa soluzione, facendo clic su un'intestazione verrà applicato il tuo ordinamento personalizzato, che dovrebbe rimanere 'attivo' indipendentemente da eventuali modifiche ai dati sottostanti.

https://stackoverflow.com/a/18218963/2115261