2016-04-19 22 views
0

So habe ich eine DataGrid in meinem UserControl. Es ist zu einem observable collection in My ViewModel verbunden. Das ViewModel implementiert die Schnittstelle INotifyPropertyChanged und wurde in der Ansicht entsprechend verdrahtet.Datagrid nicht aktualisiert, wenn Abfrage ausgelöst wird

Aus meiner Sicht:

<DataGrid AutoGenerateColumns="False" 
      EnableRowVirtualization="True" 
      ItemsSource="{Binding ContributionCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 

<!-- DataGrid rows --> 

/> 

und in dem Viewmodel:

private ObservableCollection<contribution> _contributionCollection; 
    public ObservableCollection<contribution> ContributionCollection 
    { 
     get 
     { 
      return _contributionCollection; 
     } 
     set 
     { 
      _contributionCollection= value; 
      OnPropertyChanged("ContributionCollection"); 
     } 
    } 

Was, das ist geschehen soll; Mit einem Klick auf eine bestimmte Schaltfläche wird eine Abfrage für die Datenbank ausgelöst und einige Ergebnisse zurückgegeben. Diese Ergebnisse sollen im Datagrid angezeigt werden.

// Fired by an ICommand Property 
    public object Contributions_CommandExecute(object param)           
    { 
     var queryContributions = context.contributions.Where(c => c.member == Member); 
     return _contributionCollection = new ObservableCollection<contribution>(queryContributions); 
    } 

Aber das Datagrid kommt immer leer. Die Anwendung friert ein wenig ein, was darauf hindeutet, dass etwas im Hintergrund passiert, aber nichts wird tatsächlich auf die Ansicht übertragen. Tatsächlich funktioniert der ViewModel-Konstruktor nur dann ordnungsgemäß, wenn er bei der Initialisierung ausgelöst wird. Aber danach wird es nicht mehr feuern.

Irgendeine Idee, wo ich falsch liege?

Antwort

1

diese Linie

return _contributionCollection = new ObservableCollection<contribution>(queryContributions); 

Updates nur Wert des Feldes. Da es keine Eigenschaft Setter verwenden, wird OnPropertyChanged("ContributionCollection"); nicht

die Lösung mit Eigenschaft wird zur Arbeit genannt (übrigens, warum Methode ungültig oder nicht?)

// Fired by an ICommand Property 
public void Contributions_CommandExecute(object param) 
{ 
    var queryContributions = context.contributions.Where(c => c.member == Member); 
    ContributionCollection = new ObservableCollection<contribution>(queryContributions); 
} 
+0

Viel Dankbarkeit. Abgesehen davon, habe ich auch vergessen, die 'INotifyPropertyChanged' Schnittstelle hinzuzufügen. – Offer

0

müssen Sie die Liste aktualisieren mit dont Interrupt der GUI wie dies ein Dispatcher, so dass Sie:

Dispatcher.BeginInvoke(new Action(() => _contributionCollection = new ObservableCollection<contribution>(queryContributions))); 

ich hatte ein ähnliches Problem:

Update Observable Collection

1

Ansicht

<DataGrid AutoGenerateColumns="False" 
      EnableRowVirtualization="True" 
      ItemsSource="{Binding ContributionCollection}"> 

<!-- DataGrid rows --> 

/> 

Ansichtsmodell

public void Contributions_CommandExecute(object param)           
    { 
     ContributionCollection = new ObservableCollection<contribution>(context.contributions.Where(c => c.member == Member)); 
    } 
Verwandte Themen