MVVM Delegate Command with an ObservableCollection






4.33/5 (2 votes)
Loading from webservice and after a processing update the UI
First of all, I get the
DelegateCommand
from the .toolbox courses (I encourage you to download them and find it).
Using this DelegateCommand
which we bind to a button Command for instance (I always add CommandParameter
in XAML too (in order to work fine).
Now my layoutroot datacontext viewmodel has the following property:
private ObservableCollection _sales; public ObservableCollection Sales { get { return _sales; } set { _sales= value; NotifyPropertyChanged(() => Sales); } }And now (in this case, it is a WPF application, in case you use SL I recommend you to use
PagedViewCollection
), I instance the command in the constructor:
PaidCommand = new DelegateCommand() { ExecuteCommand = () => { bw = new BackgroundWorker(); bw.RunWorkerCompleted += (s, e) => { NotifyPropertyChanged(() => Sales); //#1 }; bw.DoWork += (s1, e1) => { _sales= DM.GetSales(_date1, _date2); //#2 }; bw.RunWorkerAsync(); } };In #2, we process every line of code we want filling our
private
fields and when it's finished, we publish
simply Notifying them #1 (In my case, I have a datagrid
with ItemsSource = {Binding Sales})
.
I hope it helps you (I like this way of doing it).
A new overloaded method for the NotifyPropertyChanged
method to leverage the use of expressions instead of strings:
protected void NotifyPropertyChanged<T>(Expression<Func<T>>expression)
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression == null)
throw new ArgumentException("expression must be a property expression");
RaisePropertyChanged(memberExpression.Member.Name);
}