在挂起InitializeTask.PropertyChanged之前触发mvvmcross Viewmodel.Initialize

时间:2018-02-02 16:26:05

标签: c# android xamarin xamarin.android mvvmcross

在我的应用中,我想在初始化完成时在视图中知道。问题是它可以在你挂钩InitializeTask.PropertyChanged之前启动。这是我的ViewModel代码:

    public override async Task Initialize()
    {
        ClientID = await MyDataSource.GetClientID();

    }

在我的视图中,我正在执行以下操作:

    protected override void OnViewModelSet()
    {
        var vm = this.DataContext as MyViewModel;

        vm.InitializeTask.PropertyChanged += InitializeTask_PropertyChanged;

        base.OnViewModelSet();
    }

    private void InitializeTask_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "IsSuccessfullyCompleted")
        {
            vm.InitializeTask.PropertyChanged -= InitializeTask_PropertyChanged;
            if (vm.ClientID != "")
                posClient = new PosClient(this, vm.ClientID);
        }
    }

据我所知,OnViewModelSet是最快的,您可以在View中访问ViewModel。如果我输入断点,则在触发OnViewModelSet之前运行Initialize。这使得在挂钩事件之前,Initialize很可能已经完成。 View中是否有另一个位置可以在Initialize启动之前挂钩事件,这样您就可以保证Initialize.PropertyChanged会在View中触发?

****更新****

我关注了@fmaccaroni的建议并实现了一个名为DataLoaded的MvxInteraction。我做的一件事就是创建一个单独的函数来加载数据。

    public void LoadData()
    {
        Task.Run(async () =>
        {
            ClientID = await IHSDataSource.GetClientID();
            _DataLoaded.Raise();
        });
    }

在关注交互事件之前,我担心异步任务完成。这样做,我在视图中添加了这个。

    protected override void OnViewModelSet()
    {
        vm = this.DataContext as InvoiceViewModel;

        var set = this.CreateBindingSet<InvoiceView, InvoiceViewModel>();
        set.Bind(this).For(view => view.DataLoaded).To(viewModel => viewModel.DataLoaded).OneWay();
        set.Apply();

        vm.LoadData();

        base.OnViewModelSet();
    }

这样,LoadData不会启动,直到我确定结果将触发交互,我保证得到结果。这是我第一次听说MvxInteraction,我现在一直在使用它。

1 个答案:

答案 0 :(得分:1)

我不确定您要实现的目标,但是如果您想在Initialize结束时在您的视图中执行操作,只需执行MvxInteraction并在{corr后调用它1}},即:

视图模型:

await

查看:

private MvxInteraction _interaction = new MvxInteraction();
public IMvxInteraction MyMvxInteraction => _interaction;

public override async Task Initialize()
{
    ClientID = await MyDataSource.GetClientID();
    this._interaction.Raise();
}

和视图中的绑定:

private IMvxInteraction _interaction;
public IMvxInteraction MyMvxInteraction
{
    get => this._interaction;
    set
    {
        if (this._interaction != null)
            this._interaction.Requested -= this.OnInteractionRequested;

        this._interaction = value;
        this._interaction.Requested += this.OnInteractionRequested;
    }
}

private void OnInteractionRequested(object sender, EventArgs e)
{
    var vm = this.DataContext as MyViewModel;

    if (vm.ClientID != "")
        posClient = new PosClient(this, vm.ClientID);
}