簡體   English   中英

MVVMCross:如何將Xamarin.Android事件綁定到ViewModel命令

[英]MVVMCross: How to bind Xamarin.Android events to ViewModel commands

我想從一個活動轉到另一個活動。 我還在學習MVVMCross,所以整個模式對我來說還是很新的。 我現在只在Xamarin.Android上應用它。

設置:

  1. MainDashboardActivity有一個Android設計支持庫的NavigationView.

  2. ViewModel MainDashboardViewModel有一個IMvxCommand GoToSecondDashboard ,它只是另一個活動的簡單ShowViewModel

NavigationView具有NavigationItemSelected事件。 通常,我會這樣做:

navigationView.NavigationItemSelected += (o, e) =>
{
    if(e.MenuItem.ItemId == Resource.Id.SecondDashboardMenu)
    {
        // make new intent to target activity
    }
};

現在我已將導航邏輯隱藏到ViewModel的IMvxCommand中,我想將它綁定到NavigationView的事件,不再創建意圖和諸如此類的東西。 我怎么做到這一點?

我想在代碼文件中使用流暢的綁定邏輯而不是在布局中,就像這個答案的作用一樣:

protected override void OnViewModelSet()
{
    SetContentView(Resource.Layout.View_Tip);

    var edit = this.FindViewById<EditText>(Resource.Id.FluentEdit);

    var set = this.CreateBindingSet<TipView, TipViewModel>();
    set.Bind(edit).To(vm => vm.SubTotal);
    set.Apply();

    // for non-default properties use 'For':
    // set.Bind(edit).For(ed => ed.Text).To(vm => vm.SubTotal);

    // you can also use:
    //   .WithConversion("converter", "optional parameter")
    //   .OneTime(), .OneWay() or .TwoWay()
}

NavigationItemSelected是一個事件。 我無法找到將事件綁定到命令的方法。 在可能發生之前還有過濾ItemId的邏輯,所以它甚至不是一個簡單的事件到命令綁定。

我不確定這是否是正確的方法。 我想要的只是將菜單點擊綁定到代碼文件中的命令而不是布局文件。

由於沒有為NavigationView定義綁定目標,因此您將無法像Cyriac在其帖子中描述的那樣綁定。

目標綁定在內部執行的操作只是訂閱事件並對其作出反應並將該數據作為屬性公開。

因此,由於目前無法獲取ItemsSource並綁定到NavigationView ,您必須執行類似於已經執行的操作,將EventHandler掛接到event ,並直接調用ViewModel ,即調用Command。 這看起來像這樣:

navigationView.NavigationItemSelected += ItemSelected;

private void ItemSelected(object sender, NavigationItemSelectedEventArgs args)
{
    ViewModel.NavigateCommand.Execute(args.MenuItem.TitleFormatted.ToString());
}

然后在Command中的ViewModel中:

private void DoNavigateCommand(string title)
{
    if (title == "Derp")
        ShowViewModel<DerpViewModel>();
}

或者,您可以將此代碼包裝在Target Binding中。 您可以在官方MvvmCross github存儲庫中看到它們是如何實現

我在http://crosscuttingconcerns.com/MvvmCross-Fluent-Databinding上找到了其他人的答案,您應該嘗試一下。 我認為你不能直接引用Event,而是必須使用字符串。

protected override void OnViewModelSet ()
{
        SetContentView (Resource.Layout.TermsPage);

        var set = this.CreateBindingSet<TermsView, TermsViewModel>();
        set.Bind(FindViewById<Button>(Resource.Id.acceptTermsButton))
            .For("Click")
            .To(vm => vm.AcceptTermsCommand);
        set.Apply();
}

當然,你可以根據你的活動進行調整。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM