I have a UserControl view which require data to be pulled from the database to set the ObservableCollection in order to render a DataGrid.
I want to set the ObservableCollection when the UserControl is loaded not when the view model is constructed. Also, I prefer to asynchronously set the ObservableCollection so the UserContror opens immediacy then then the data-grid is set when the data becomes available.
In my view model I create a public method called SetVendors() which fetches the data from the database and sets ObservableCollection just before the view is notified. However, I am using the view class directly to set the SetVendors() method which sound like a bad practice for some reason to me.
Questions Is it possible to set the data on view-load directly from the view-model? If so, how? Also, is it possible to set the data asynchronously so the view loads quick?
Here is my ViewModel code
public class VendorsListViewModel : ViewModel
{
    protected IUnitOfWork UnitOfWork { get; set; }
    public int CurrentPage { get; set; }
    public int ModelsPerPage { get; set; }
    public IPagedList PageMeta { get; set; }
    private ObservableCollection<Vendor> _Vendors { get; set; }
    public ObservableCollection<Vendor> Vendors
    {
        get
        {
            return _Vendors;
        }
        set
        {
            _Vendors = value;
            NotifyPropertyChanged();
        }
    }
    public VendorsListViewModel(IUnitOfWork unitOfWork)
        : base()
    {
        UnitOfWork = unitOfWork;
        CurrentPage = 1;
        ModelsPerPage = 20;
    }
    public VendorsListViewModel()
        : this(new UnitOfWork())
    {
    }
    public void SetVendors()
    {
        var vendors = UnitOfWork.Vendors.Get(CurrentPage, ModelsPerPage);
        Vendors = new ObservableCollection<Vendor>(vendors);
        PageMeta = vendors.GetMetaData();
    }
}
This is how currently set the data from the code behind the view which sound like a bad practice to me.
public partial class Index : UserControl
{
    public Index()
    {
        InitializeComponent();
    }
    // This event is called from the view when the form is loaded using `Loaded="ViewLoaded"` XAML code
    private void ViewLoaded(object sender, EventArgs e)
    {
        (DataContext as VendorsListViewModel).SetVendors();
    }
}