在我的应用中,我想在初始化完成时在视图中知道。问题是它可以在你挂钩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,我现在一直在使用它。
答案 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);
}