Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MvvmCross视图模型初始化完成_C#_Xamarin_Mvvmcross - Fatal编程技术网

C# MvvmCross视图模型初始化完成

C# MvvmCross视图模型初始化完成,c#,xamarin,mvvmcross,C#,Xamarin,Mvvmcross,在MvvmCross的版本5中,添加了一个异步初始化覆盖,您可以在其中执行繁重的数据加载 public override async Task Initialize() { MyObject = await GetObject(); } 是否有方法在视图中确定初始化已完成?假设在视图中,我想将工具栏标题设置为MyObject中的显示字段 MyViewModel vm; protected override void OnCreate(Bundle savedInsta

在MvvmCross的版本5中,添加了一个异步初始化覆盖,您可以在其中执行繁重的数据加载

public override async Task Initialize()
{
    MyObject = await GetObject();
}
是否有方法在视图中确定初始化已完成?假设在视图中,我想将工具栏标题设置为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;

    }
在设置SupportActionBar.Title的行上,是否有方法确定初始化任务是否已完成,如果未完成,则在完成时收到通知

更新:
我试图给出两个正确答案,因为@nmilcoff回答了我的实际问题,@Trevor Balcom向我展示了一种更好的方法来做我想做的事情。

是的,您可以订阅InitializeTask的属性更改

类似这样的方法会奏效:

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;
}
当然,在这种情况下,只听
ViewModel.MyObject.Name
属性更改可能更容易。但以上是侦听InitializeTask属性更改的通用方法


您可以在中了解有关
InitializeTask
MvxNotifyTask
的更多信息。

工具栏还支持数据绑定
Title
属性,如下所示:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:popupTheme="@style/AppTheme.PopupOverlay"
    app:MvxBind="Title MyObject.Name" />

关于Xamarin表单: 我想在VM中添加属性更改事件登录,以便能够对其进行测试,因此:

View.xaml.cs

protected override void OnViewModelSet()
{
    base.OnViewModelSet();
    var vm = this.DataContext as SearchMovieViewModel;
    if (vm is null)
    {
        return;
    }

    vm.OnViewModelSet();
}
在ViewModel上:

/// <summary>
/// This method should be called in every View Code Behind when you
/// need to subscribe to InitializeTask changes.
/// </summary>
public void OnViewModelSet()
{
    if (this.InitializeTask is null)
    {
        return;
    }
    this.InitializeTask.PropertyChanged += this.InitializeTask_PropertyChanged;
}
不要忘记取消订阅,例如当视图被破坏时。可以在视图模型中替代此方法:

public override void ViewDestroy(bool viewFinishing = true)
{
        base.ViewDestroy(viewFinishing);
        this.InitializeTask.PropertyChanged -= this.InitializeTask_PropertyChanged;
}

我以前尝试过这种方法,但问题是Initialize()是在钩住PropertyChanged事件之前调用的,如果它在钩住事件之前完成,则事件处理程序永远不会收到通知。我看到了MvxNotifyTask,但它没有说明如何连接它以侦听Initialize()任务。我会看看InitializeTask,看看这是否是答案。我没有看到ViewModel中有一个名为InitializeTask的属性。没关系。我必须更新到MvvmCross的最新版本。它做到了。谢谢兄弟。这是一个更好的方式来做我想做的事。它只允许我设置一个正确答案,所以我必须选择一个回答实际问题的答案。我正在检查我的代码,并使用您的方法设置所有内容的标题。谢谢兄弟。
public override void ViewDestroy(bool viewFinishing = true)
{
        base.ViewDestroy(viewFinishing);
        this.InitializeTask.PropertyChanged -= this.InitializeTask_PropertyChanged;
}