I worried about this code in a ViewModel. ViewModel should not contain any code except binding's. But without async update the ui would freeze. How do I improve it? I'm restricted to using .net 3.5 or below.
public ShippingDocumentsRegisterViewModel()
{
this.Columns = model.InitializeColumns();
Action<object> Documents = new Action<object>(GetDocumentsAsync);
IAsyncResult result = Documents.BeginInvoke(new AsyncCallback(GetDocumentsAsync),null, null);
}
public void GetDocumentsAsync(object param)
{
this.ShippingDocuments = model.GetDocuments();
}
Model:
class ShippingDocumentsModel
{
public ObservableCollection<ShippingDocument> GetDocuments()
{
var documents = new ObservableCollection<ShippingDocument>();
for (int i = 0; i < 100; i++)
{
System.Threading.Thread.Sleep(50);
documents.Add(new ShippingDocument { Name = i.ToString() });
}
return documents;
}
public ObservableCollection<ShippingDocumentColumDescriptor> InitializeColumns()
{
return new ObservableCollection<ShippingDocumentColumDescriptor>
{
new ShippingDocumentColumDescriptor { HeaderText = "Статус", DisplayMember = "Status" },
new ShippingDocumentColumDescriptor { HeaderText = "Підпис", DisplayMember = "Signature" }
};
}
}
ViewModel:
public class ShippingDocumentsRegisterViewModel : ViewModelBase
{
ShippingDocumentsModel model = new ShippingDocumentsModel();
public ShippingDocumentsRegisterViewModel()
{
this.Columns = model.InitializeColumns();
Action<object> Documents = new Action<object>(GetDocumentsAsync);
IAsyncResult result = Documents.BeginInvoke(new AsyncCallback(GetDocumentsAsync),null, null);
}
public void GetDocumentsAsync(object param)
{
this.ShippingDocuments = model.GetDocuments();
}
private ObservableCollection<ShippingDocument> shippingDocuments;
public ObservableCollection<ShippingDocument> ShippingDocuments
{
get
{
return shippingDocuments;
}
private set
{
shippingDocuments = value;
RaisePropertyChanged("ShippingDocuments");
}
}
public ObservableCollection<ShippingDocumentColumDescriptor> Columns { get; private set; }
private ICommand _addColumnCommand;
public ICommand AddColumnCommand
{
get
{
if (_addColumnCommand == null)
{
_addColumnCommand = new RelayCommand<string>(
s =>
{
this.Columns.Add(new ShippingDocumentColumDescriptor { HeaderText = s, DisplayMember = s });
});
}
return _addColumnCommand;
}
}
private ICommand _removeColumnCommand;
public ICommand RemoveColumnCommand
{
get
{
if (_removeColumnCommand == null)
{
_removeColumnCommand = new RelayCommand<string>(
s =>
{
this.Columns.Remove(this.Columns.FirstOrDefault(d => d.DisplayMember == s));
});
}
return _removeColumnCommand;
}
}
}
Edit:
I think maybe this solution would be better?
BackgroundWorker BW = new BackgroundWorker();
BW.DoWork += (o, e) =>
{
this.ShippingDocuments = model.GetDocuments();
};
BW.RunWorkerAsync();
System.Threading.Thread.Sleep(50);
in the model for? \$\endgroup\$