2017-01-26 3 views
2

XamarinのAndroidアプリに問題があります。 MenuCardView.axmlはItemSourceとMvxGridViewがありますが、ここでItemClickを使いたくありません。私はMvxBindを使用したい。そこにボタンのMvxItemTemplateをクリックする。しかしクリックはここではうまくいきません。ここでMvxBindボタンをクリックしてMvxGridViewで動作しない

は私MenuCardView.axmlです:ここでは

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res-auto" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:stretchColumns="0"> 
    <TableRow> 
     <LinearLayout 
       android:orientation="vertical" 
       android:layout_weight="1" 
       android:background="@color/white" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 
       <MvxGridView 
        android:id="@+id/menuCardDetailGrid" 
        android:layout_weight="1" 
        android:background="@android:color/transparent" 
        local:MvxBind="ItemsSource MenuItems" 
        local:MvxItemTemplate="@layout/menucarddetailitemview" 
        android:numColumns="1" 
        android:verticalSpacing="5dp" 
        android:horizontalSpacing="5dp" 
        android:stretchMode="columnWidth" 
        android:gravity="center" 
        android:divider="@android:color/transparent" 
        android:dividerHeight="0dp" 
        android:choiceMode="singleChoice" 
        android:listSelector="@drawable/list_color_selector" 
        android:layout_width="match_parent" 
        android:layout_height="300dp" 
        android:layout_marginBottom="25dp" /> 
     </LinearLayout> 
    </TableRow> 
</TableLayout> 

は私MenuCardDetailItemView.axmlです:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_weight="1" 
    android:layout_height="match_parent" 
    android:background="@android:color/white" 
    android:orientation="vertical" 
    android:gravity="center_horizontal" 
    android:id="@+id/menucarddetailitemview"> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="50dp" 
     android:layout_gravity="fill" 
     android:orientation="horizontal"> 
     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:layout_marginLeft="10dp"> 
      <TextView 
       local:MvxBind="Text Name" 
       android:textSize="15dp" 
       android:layout_height="wrap_content" 
       android:textColor="@android:color/black" 
       android:layout_gravity="center_vertical" 
       android:lines="2" 
       android:maxLines="2" 
       android:layout_width="185dp" /> 
     </LinearLayout> 
     <LinearLayout 
      android:layout_width="60dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:gravity="center_horizontal"> 
      <TextView 
       local:MvxBind="Text Price" 
       android:textSize="15dp" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textColor="@android:color/black" 
       android:layout_gravity="center_vertical" /> 
     </LinearLayout> 
     <LinearLayout 
      android:layout_width="50dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:gravity="center_horizontal" 
      android:layout_marginRight="10dp" 
      android:layout_marginLeft="10dp"> 
      <Button 
       local:MvxBind="Click MenuItemClickCommand" 
       android:background="@color/red" 
       android:text="CLICK" 
       android:layout_width="60dp" 
       android:layout_height="20dp" 
       android:id="@+id/buttonMenuDetail" 
       android:layout_gravity="center_vertical" 
       android:textSize="13dp" 
       android:textColor="@color/white"/> 
     </LinearLayout> 
    </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 

そして、ここでは私のMenuCardViewModel.csです:

public class MenuCardViewModel : BaseViewModel 
{ 
    public MenuCardViewModel(IMvxMessenger messenger) : base(messenger) 
    { 
    } 

    public void Init(Menu menu) 
    { 
     Header = menu.Header; 
     InitializeMenuItems(menu); 
    } 

    private void InitializeMenuItems(Menu menu) 
    { 
     if (menu.MenuItemsList == null) 
     { 
      var offline = Mvx.Resolve<IOfflineContent>(); 
      var loadedMenu = offline.GetMenuDetailFromApi(menu.Id); 
      MenuItems = loadedMenu.MenuItemsList; 
     } 
     else 
     { 
      MenuItems = menu.MenuItemsList; 
     } 
    } 

    private string _header; 
    public string Header 
    { 
     get { return _header; } 
     set 
     { 
      _header = value; 
      RaisePropertyChanged(() => Header); 
     } 
    } 

    private List<MenuItem> _menuItems; 
    public List<MenuItem> MenuItems 
    { 
     get { return _menuItems; } 
     set 
     { 
      _menuItems = value; 
      RaisePropertyChanged(() => MenuItems); 
     } 
    } 

    private ICommand _menuItemClickCommand; 
    public ICommand MenuItemClickCommand 
    { 
     get 
     { 
      _menuItemClickCommand = _menuItemClickCommand ?? new MvxCommand(DoMenuItemClickCommand); 
      return _menuItemClickCommand; 
     } 
    } 

    private void DoMenuItemClickCommand() 
    { 
     // code here... 
    } 
} 

MenuCardVideDetailViewのButtonにMenuItemClickCommandをバインドします。いくつかのヒントはどのようにこの問題を解決する?

UPDATE:

私はそれが動作しますが、私はこれは良い解決策であるかどうかを知るいけない、これを試してみました:のItemsSourceがMenuItemsにバインドされている

public class MenuCardViewModel : BaseViewModel 
    { 
     public MenuCardViewModel(IMvxMessenger messenger) : base(messenger) 
     { 
     } 

     public void Init(Menu menu) 
     { 
      Header = menu.Header; 
      InitializeMenuItems(menu); 
     } 

     private void InitializeMenuItems(Menu menu) 
     { 
      if (menu.MenuItemsList == null) 
      { 
       var offline = Mvx.Resolve<IOfflineContent>(); 
       var loadedMenu = offline.GetMenuDetailFromApi(menu.Id); 
       //MenuItems = loadedMenu.MenuItemsList; 
       MenuItems = new List<MenuItemHolder>(); 

       foreach(var item in loadedMenu.MenuItemsList) 
       { 
        MenuItems.Add(new MenuItemHolder(item, this)); 
       } 

      } 
      else 
      { 
       //MenuItems = menu.MenuItemsList; 
      } 

     } 

     private string _header; 
     public string Header 
     { 
      get { return _header; } 
      set 
      { 
       _header = value; 
       RaisePropertyChanged(() => Header); 
      } 
     } 

     private List<MenuItemHolder> _menuItems; 
     public List<MenuItemHolder> MenuItems 
     { 
      get { return _menuItems; } 
      set 
      { 
       _menuItems = value; 
       RaisePropertyChanged(() => MenuItems); 
      } 
     } 
    } 

    public class MenuItemHolder 
    { 
     MenuCardViewModel _parent; 

     public int Id { get; set; } 

     private string _name; 
     public string Name 
     { 
      get { return _name; } 
      set 
      { 
       _name = value; 
      } 
     } 

     private string _price; 
     public string Price 
     { 
      get { return _price; } 
      set 
      { 
       _price = value; 
      } 
     } 

     public MenuItemHolder(MenuItem item, MenuCardViewModel parent) 
     { 
      _parent = parent; 
      Id = item.Id; 
      Name = item.Name; 
      Price = item.Price; 
     } 

     private ICommand _menuItemClickCommand; 
     public ICommand MenuItemClickCommand 
     { 
      get 
      { 
       _menuItemClickCommand = _menuItemClickCommand ?? new MvxCommand(DoMenuItemClickCommand); 
       return _menuItemClickCommand; 
      } 
     } 

     private void DoMenuItemClickCommand() 
     { 
      var item = this; 
      //here I can use BaseViewModel 
      _parent.Credit = 1337; 
      _parent.Bonus = 68; 
     } 
    } 
} 
+0

あなたは 'ItemClick'を使用したくないなぜあなたは特別な理由がありますか?それは同じ振る舞いを持っています – esiprogrammer

+0

私はボタンをクリックしたいだけで、アイテム全体ではありません。クリック可能な機能を備えたボタンが必要です。将来は別のクリックバインドが必要です。 – pnk

+0

エプロプログラマーが正しいです。私はあなたが親のdataContextにmvvmcrossでバインドできるとは思わない –

答えて

1

MvxGridViewので、各MvxItemTemplateがバインドされList<MenuItem>ですMenuItemButtonMenuItemClickCommandにバインドする場合は、そのコマンドをMenuItemクラスに移動する必要があります。

子の親DataContextにアクセスする権限がありません。いくつかのアプローチを実装することができます。通信にはMvvmCross Messenger pluginを使用し、親からオブジェクトを要求できます。 それとも あなたのようMenuItemの親(MenuCardViewModel)をラップすることができます:

public class MenuItem 
{ 
    MenuCardViewModel parent; 
    //// pass parent to menuItem 
    public MenuItem(MenuCardViewModel parent) 
    { 
    this.parent=parent; 
    } 

    public ICommand MenuItemClickCommand 
    { 
     get 
     { 
      return MvxCommand(() -> this.parent.DoMenuItemClickCommand(this)); 
     } 
    } 
} 

MenuCardViewModelで:

public class MenuCardViewModel 
{ 
    .... 
public MenuCardViewModel(MenuItem menu) 
{ 
    /// do something 
} 
} 
+0

あなたはこのバインドをクリックしても動作しますが問題がありますか?MenuCardViewModelが継承しているBaseViewModelからCallプロパティが必要です。MenuItemクラスからI can not .... – pnk

+0

私は私のソリューション..このソリューションについてどう思いますか? – pnk

+0

はい。それは私が説明しようとしていたのと同じです。私には良い解決策と聞こえる – esiprogrammer

関連する問題