2017-09-06 3 views
0

Je sais qu'il y a beaucoup de questions sur les problèmes de liaison. Mais je n'ai trouvé aucune solution - et je n'ai aucune idée de ce qui ne va pas dans mon code.Liaison WPF ne pas mettre à jour dans DataGrid (avec le regroupement)

J'ai 2: Collections

public ObservableCollection<TicketEntry> AllEntries {get; set;} 

public ObservableCollection<TicketEntry> Entries {get; set;} 

Entity a une propriété IsFavourite:

private bool _isFavourite = false; 
public bool IsFavourite 
{ 
    get { return _isFavourite; } 
    set 
    { 
     _isFavourite = value; 
     OnPropertyChanged(); 
     OnPropertyChanged("ImageSource"); 
} 

string ImageSource 
{ 
    get 
    { 
     if (IsFavourite) 
     { 
      return "pack://application:,,,/Resources/star_true.png"; 
     } 
     else 
     { 
      return "pack://application:,,,/Resources/star_false.png"; 
     } 
    } 
} 

<CollectionViewSource x:Key="Collection" 
         Source="{Binding Entries, 
           UpdateSourceTrigger=PropertyChanged, 
           Mode=TwoWay, 
           NotifyOnSourceUpdated=True}" 
         xmlns:s="clr-namespace:System;assembly=mscorlib"> 
     <CollectionViewSource.GroupDescriptions> 
      <PropertyGroupDescription PropertyName="IsFavourite" /> 
     </CollectionViewSource.GroupDescriptions> 
     <CollectionViewSource.LiveGroupingProperties> 
      <s:String>IsFavourite</s:String> 
     </CollectionViewSource.LiveGroupingProperties> 
    </CollectionViewSource> 

//Handler for Command ((un)set-favourite) 
private void HandleInvertFavourite() 
    { 
     if (IsFavourite) 
     { 
      IsFavourite = false; 
     } 
     else 
     { 
      IsFavourite = true; 
     } 
     AllTicketsViewModel.Instance.InvokeFavouritesChanged(this); 
    } 



internal void InvokeFavouritesChanged(TicketEntry ticketEntry) 
{ 
    if(ticketEntry.IsFavourite) // Add 
     { 
      if(CurrentWeekViewModel.Instance.Entries.Any(x => x.TicketId == ticketEntry.TicketId)) // already exists 
      { 
       TicketEntry existingentry = CurrentWeekViewModel.Instance.Entries.First(x => x.TicketId == ticketEntry.TicketId); 
       CurrentWeekViewModel.Instance.Entries.First(x => x.TicketId == ticketEntry.TicketId).IsFavourite = true; 
      } 
      else 
      { 
       CurrentWeekViewModel.Instance.Entries.Add(ticketEntry); 
      } 
     } 
     else // Remove 
     { 
      if(CurrentWeekViewModel.Instance.Entries.Any(x => x.TicketId == timeTicketEntry.TicketId)) 
      { 
       TicketEntry existingentry = CurrentWeekViewModel.Instance.Entries.First(x => x.TicketId == ticketEntry.TicketId); 
       if (existingentry.TimeBookings.Any(x => x.Date > CurrentWeekViewModel.Instance.SelectedWeek.FirstDay && 
                 x.Date < CurrentWeekViewModel.Instance.SelectedWeek.LastDay && 
                 existingentry.IsFavourite)) 
       //has time data for actual week => keep but set fav = false 
       { 

        existingentry.IsFavourite = false; 
       } 
       else // completely remove 
       { 

        CurrentWeekViewModel.Instance.Entries.Remove(existingentry); 
       } 
      } 
     } 
} 

Également le CurrentWeek -DataGird a Grouping sur IsFavourite - Je m'attends à ce que les entrées existantes commutent le groupe sur IsFavourite_Changed.

choses que j'ai vérifié:

  • Manchettes sont corrects
  • INotifyPropertyChanged est correctement mis en œuvre
  • Ajout de nouveaux favoris œuvres (SEULS existantes sont problématiques)

Pourquoi n » t le regroupement change-t-il lorsque la propriété change?

+0

Essayez de définir la propriété IsLiveGroupingRequested de CollectionViewSource sur true. – mm8

+0

@ mm8 vous voulez dire le regroupement droit ^^? –

Répondre

1

Définissez la propriété IsLiveGroupingRequested du CollectionViewSource sur true.