Search code examples
c#xamarinmvvmcross

MvvmCross View Model Initialize Complete


In version 5 of MvvmCross, there has been added an asynchronous Initialize override where you can do you heavy data loading.

public override async Task Initialize()
{
    MyObject = await GetObject();
}

Is there a way to determine in the View that the Initialize has completed? Say in the View I want to set the Toolbar Title to a display a field in MyObject

    MyViewModel vm;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        // Create your application here

        this.SetContentView(Resource.Layout.MyView);

        var toolbar = (Toolbar)FindViewById(Resource.Id.toolbar);
        SetSupportActionBar(toolbar);

        vm = (MyViewModel)this.ViewModel;

        SupportActionBar.Title = vm.MyObject.Name;

    }

On the line that sets the SupportActionBar.Title, is there a way to know for sure whether the Initialize task has completed and if not, get notified when it does?

UPDATE: I tried set two correct answers because @nmilcoff answered my actual question and @Trevor Balcom showed me a better way to do what I wanted.


Solution

  • Yes, you can subscribe to InitializeTask's property changes.

    Something like this will work:

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
    
        // your code
    
        ViewModel.PropertyChanged += MyViewModel_PropertyChanged;
    }
    
    private void MyViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if(e.PropertyName == nameof(ViewModel.InitializeTask) && ViewModel.InitializeTask != null)
        {
            ViewModel.InitializeTask.PropertyChanged += ViewModel_InitializeTask_PropertyChanged;
        }
    }
    
    private void ViewModel_InitializeTask_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if(e.PropertyName == nameof(ViewModel.InitializeTask.IsSuccessfullyCompleted))
            SupportActionBar.Title = ViewModel.MyObject.Name;
    }
    

    Of course, it could be the case that it might be easier to just listen to ViewModel.MyObject.Name property changes. But the above is a generic way to listen to InitializeTask property changes.

    You can learn more about InitializeTask and MvxNotifyTask in the official documentation.