Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / C#

MVVM Delegate Command with an ObservableCollection

4.33/5 (2 votes)
18 Sep 2010CPOL 19.6K  
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:
C#
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);
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)