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);
};
bw.DoWork += (s1, e1) =>
{
_sales= DM.GetSales(_date1, _date2);
};
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);
}