2013-07-16 40 views
1

我有一個MvxSpinner如下定義,我想,當用戶通過ItemSelected的微調選擇一個項目結合觸發命令:是否存在針對OnItemSelected事件的MvvmCross MvxSpinner綁定?

<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" /> 

這成功地將觸發這也成功地使用視圖模型的SelectedJobStatus屬性更新作業列表中FilterJobsByStatusCommand。如果ItemSelected綁定工作,或者我錯過了一些其他代碼或不同的綁定?

回答

2

ItemSelectedEventHandler<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)); 

如果有幫助,有一些背景,以最近一次獲得自動綁定到TEventArgs事件工作https://github.com/slodge/MvvmCross/issues/313


如果您的應用程序只能應付一個綁定值而不是bo http://slodge.blogspot.com/2013/07/n35-multibinding-with-tibet-n1-videos.html - - UND事件/命令,則SelectedItem結合我在N + 1的視頻作品,昨晚我記錄源在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

11

嘗試綁定在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" /> 
+0

此解決方案完美無缺!我希望我能給它10投票 –

+1

你如何從命令中選擇項目? – PutraKg

+0

您可以使用帶參數的命令:'MvxAsyncCommand handleYearSelectedCommand'(T是所選項目的類型)。 – sabvente