1

以下のように定義された MvxSpinner があり、ユーザーがItemSelectedバインディングを介してスピナーのアイテムを選択したときにコマンドをトリガーしようとしています:

    <Mvx.MvxSpinner
        style="@style/Spinners"
        android:id="@+id/jobStatusSpinner"
        android:prompt="@string/jobstatus_prompt"
        local:MvxBind="ItemsSource JobStatuses; SelectedItem SelectedJobStatus; ItemSelected FilterJobsByStatusCommand"
        local:MvxDropDownItemTemplate="@layout/spinner_jobstatuses"
        local:MvxItemTemplate="@layout/item_jobstatus" />

FilterJobsByStatusCommandボタンを追加することで、ビューから を呼び出せることを確認しました:

<Button
    android:text="Test"
    android:background="@drawable/StandardButton"
    style="@style/Buttons.FullWidth"
    android:layout_centerHorizontal="true"
    local:MvxBind="Click FilterJobsByStatusCommand" />

FilterJobsByStatusCommandこれにより、 ViewModelのプロパティを正常に使用してSelectedJobStatusジョブのリストを更新する が正常にトリガーされます。バインディングは機能するはず ItemSelectedですか、それとも他のコードまたは別のバインディングが不足していますか?

4

2 に答える 2

12

HandleItemSelectedプロパティにバインドしてみてください。試行ICommand値です。

<Mvx.MvxSpinner
        style="@style/Spinners"
        android:id="@+id/jobStatusSpinner"
        android:prompt="@string/jobstatus_prompt"
        local:MvxBind="ItemsSource JobStatuses; SelectedItem SelectedJobStatus; HandleItemSelected FilterJobsByStatusCommand"
        local:MvxDropDownItemTemplate="@layout/spinner_jobstatuses"
        local:MvxItemTemplate="@layout/item_jobstatus" />
于 2014-04-01T13:29:31.713 に答える
2

ItemSelectedであるEventHandler<ItemSelectedEventArgs>ため、カスタム バインディングなしではバインドできません。

カスタム バインドを作成するには、http://slodge.blogspot.co.uk/2013/06/n28-custom-bindings-n1-days-of-mvvmcross.htmlを参照してください。

単純なイベントからコマンドへのバインドの場合、おそらく次のようなものに基づいて顧客のバインドを行うことができます: https://github.com/slodge/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Binding.Droid/Target/ MvxViewLongClickBinding.cs - たとえば次のようなもの:

public class SpinnerItemSelectedBinding : MvxAndroidTargetBinding
{
    private ICommand _command;

    protected MvxSpinner View
    {
        get { return (MvxSpinner) Target; }
    }

    public SpinnerItemSelectedBinding (MvxSpinner view)
        : base(view)
    {
        view.ItemSelected += ViewOnItemSelected;
    }

    private void ViewOnItemSelected(object sender, ItemSelectedEventArgs args)
    {
        if (_command == null)
            return;

        if (!_command.CanExecute(null))
            return;

        _command.Execute(null);
    }

    public override void SetValue(object value)
    {
        _command = value as ICommand;
    }

    public override MvxBindingMode DefaultMode
    {
        get { return MvxBindingMode.OneWay; }
    }

    public override Type TargetType
    {
        get { return typeof (ICommand); }
    }

    protected override void Dispose(bool isDisposing)
    {
        if (isDisposing)
        {
            var view = View;
            if (view != null)
            {
                view.ItemSelected -= ViewOnItemSelected;
            }
        }
        base.Dispose(isDisposing);
    }
}

セットアップで次のように登録できます。

        registry.RegisterCustomBindingFactory<MvxSpinner>("ItemSelected",
                                                        view =>
                                                        new SpinnerItemSelectedBinding (view));

それが役立つ場合は、 https: //github.com/slodge/MvvmCross/issues/313 で動作する TEventArgs イベントへの自動バインディングを取得する最近の試みの背景があります。


アプリがバインドされたイベント/コマンドではなく、バインドされた値だけを処理できる場合、SelectedItem昨夜録画した N+1 ビデオでバインドが機能します - http://slodge.blogspot.com/2013/07/n35 -multibinding-with-tibet-n1-videos.html - ソースはhttps://github.com/slodge/NPlus1DaysOfMvvmCross/blob/master/N-35-Tibet/BindMe.Droid/Resources/Layout/FirstView.axml#にありますL17

SelectedItemApiExamplesサンプル プロジェクトでも使用されています: https://github.com/slodge/MvvmCross-Tutorials/blob/master/ApiExamples/ApiExamples.Droid/Resources/Layout/Test_Spinner.axml

于 2013-07-16T14:10:34.967 に答える