2013-08-18 45 views
0

我想要一個帶有一個下拉模板的MvxSpinner,它有一個按鈕。點擊按鈕會彈出一個關於該項目的信息的網頁瀏覽器。按鈕點擊工作正常,但現在無法選擇該項目。有沒有解決的辦法?帶MvxDropDownItemTemplate中的按鈕的MvxSpinner

+0

聽起來不像mvx問題 - 更一般的機器人問題。 – Stuart

+0

由於該按鈕使觸摸事件遠離微調框,因此未選擇該項目。這不是一個Mvx問題,你應該重新考慮你的標籤。 – Cheesebaron

回答

1

我想出了一種方法來完成這項工作。不知道這是否是最佳做法,但對我有用。

我讓Spinner的ItemsSource成爲一個enumerable的視圖模型。有一個按鈕單擊命令和一個事件來處理該項目中的任何其他觸摸。我分類爲MvxSpinner和MvxAdapter。在subclassed適配器中,我將事件分配給一個處理程序,該程序以編程方式單擊後退按鈕以關閉下拉列表。我還從適配器向微調器發送了一個方法,以便設置所選項目。

public class ButtonSpinner : MvxSpinner 
{ 
    public ButtonSpinner(Context context, IAttributeSet attrs) : base(context, attrs) 
    { 
     var adapter = new ButtonAdapter(context, routedItemClick); 
     adapter.ItemTemplateId = Adapter.ItemTemplateId; 
     adapter.DropDownItemTemplateId = Adapter.DropDownItemTemplateId; 
     adapter.SimpleViewLayoutId = Adapter.SimpleViewLayoutId; 
     this.Adapter = adapter; 
    } 

    private void routedItemClick(object sender, ItemClickEventArgs e) 
    { 
     this.SetSelection((int)sender); 
    } 
} 

public class ButtonAdapter : MvxAdapter 
{ 
    EventHandler<Android.Widget.AdapterView.ItemClickEventArgs> _routedItemClick; 
    View _parent; 

    public override IEnumerable ItemsSource { 
     get { 
      return base.ItemsSource; 
     } 
     set { 
      base.ItemsSource = value; 
      if (value != null) 
      { 
       foreach(var item in value) 
       { 
        var dialectItem = item as DialectItemViewModel; 
        dialectItem.DialectSelected += (object obj, EventArgs args) => { 
         var dialectItems = ItemsSource as List<DialectItemViewModel>; 
         _routedItemClick(dialectItems.IndexOf(dialectItem), null); 

         _parent.RootView.DispatchKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.Back)); 
         _parent.RootView.DispatchKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.Back)); 
        }; 
       } 
      } 
     } 
    } 

    public ButtonAdapter(Context context, EventHandler<Android.Widget.AdapterView.ItemClickEventArgs> routedItemClick) : base(context) 
    { 
     _routedItemClick = routedItemClick; 
    } 

    protected override Android.Views.View GetView (int position, Android.Views.View convertView, Android.Views.ViewGroup parent, int templateId) 
    { 
     if (_parent == null) 
      _parent = parent; 

     return base.GetView (position, convertView, parent, templateId); 
    } 
}