65.9K
CodeProject is changing. Read more.
Home

MVVM Delegate Command with an ObservableCollection

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (2 votes)

Sep 9, 2010

CPOL
viewsIcon

19561

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);
        }