2017-01-26 3 views
2

У меня проблема с Android-приложением в Xamarin. У меня есть MenuCardView.axml, где MvxGridView с ItemSource, но я не хочу использовать здесь ItemClick. Я хочу использовать MvxBind Щелкните в MvxItemTemplate на кнопке там. Но Click doesnt работает здесь.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... 
    } 
} 

Я хочу связать MenuItemClickCommand с моей кнопкой в ​​меню CardVideDetailView. Некоторые советы, как решить эту проблему?

UPDATE:

Я попытался это работает, но я не знаю, если это хорошее решение:

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

cuz Я хочу, чтобы нажимал только кнопку Button, а не весь элемент. Мне нужна кнопка с функцией clickable, и, возможно, в будущем мне понадобится еще один клик, возможно, в Text там тоже. – pnk

+0

esiprogrammer - это правильно. Я не верю, что вы можете привязываться к родительскому dataContext в mvvmcross –

ответ

1

MvxGridView ItemsSource привязан к MenuItems который является List<MenuItem> поэтому каждый MvxItemTemplate обязан MenuItem. если вы хотите привязать Button к MenuItemClickCommand, вам необходимо переместить эту команду на MenuItem класс.

У вас нет доступа к родительскому DataContext в дочернем. вы можете реализовать некоторые подходы, вы можете использовать MvvmCross Messenger plugin для связи и запросить объект у родителя. Или можно обернуть родителю (MenuCardViewModel) в MenuItem как:

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

вы это связывание нажмите на работу, но есть проблема Мне нужно свойство вызова из BaseViewModel, которое MenuCardViewModel унаследовало, и из класса MenuItem I can not .... – pnk

+0

Я обновил сообщение с моим решением .. что вы думаете об этом решении? – pnk

+0

да. это то же самое, что я пытался объяснить. звучит как хорошее решение для меня – esiprogrammer

Смежные вопросы