MvxListView - 模板内的按钮

时间:2017-03-17 12:13:16

标签: c# android xamarin mvvmcross

我在Android中创建了MvxListView。我将它绑定到ObservableCollection。

一切都很好。甚至SelectedItem命令也会正确触发。问题是当我在每个项目中添加按钮时。

我的列表包含带按钮的图像,可以相互删除。

item_photo.axml

<LinearLayout
    android:id="@+id/titleLinearLayout"
    android:layout_width="fill_parent"
    android:layout_height="40dp"
    android:background="@color/icons"
    android:orientation="horizontal">
  <TextView
      android:id="@+id/DepartureDateTitleTextView"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      local:MvxBind="Text Comment"
      android:textColor="@color/primary"
      android:textSize="17dp" />
  <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            local:MvxBind="Bitmap NativeReference, Converter=ObjectToBitmap, FallbackValue=''"/>
</LinearLayout>
<LinearLayout
       android:id="@+id/titleLinearLayout"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:background="@color/icons"
       android:orientation="horizontal">
  <Button
      android:id="@+id/PriceTextView"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Remove"
      android:textColor="@color/accent"
      android:textSize="17dp"
      local:MvxBind="Click RemoveCommand" />
</LinearLayout>

这实际上是stranbe,因为Photo和Comment属性是绑定的。

public MvxCommand RemoveCommand { get; set; }

但是RemoveCommand不会触发。有什么想法吗?

编辑:

当我向我的模型添加Command时,它的工作就是为什么属性是绑定的。那么我怎样才能在ViewModel中实现事件而不是Model?

在XAML中我可以绑定祖先`数据上下文是否可能存在?

2 个答案:

答案 0 :(得分:0)

不幸的是,这是MvvmCross的限制。 MvxListView不支持绑定到其父ViewModel。

我甚至发布了一个可能的解决方案,它使用Messenger插件与父虚拟机进行通信。 Bind button click inside customlayout using mvvmcross and mvxlistview

但是,最近我只为我的listview项创建一个包装器ViewModel,并将所有逻辑放在那里。如果我需要访问父级,我只需在我的包装器VM中添加一个属性。

类似的东西:

public class PhotoViewModel {
   public SomeViewModel ParentViewModel { get; set; }
   public PhotoModel Photo { get; set; }
   public ICommand RemovePhotoCommand {
      get {
          return new MvxCommand(() => {
              ParentViewModel.RemovePhotoCommand.Execute(this);
          });
      }
   }
}

答案 1 :(得分:0)

我为此问题创建了自定义包装器:

   public class CommandableCollectionItem<TItem, TViewModel>
                            where TViewModel : ICommandableNestedCollection<TItem>
    {
        public TItem Item { get; private set; }
        private readonly TViewModel _viewModel;

        public CommandableCollectionItem(TItem item, TViewModel viewModel)
        {
            this.Item = item;
            this._viewModel = viewModel;
        }

        public IMvxCommand Execute => new MvxCommand(() => _viewModel.OnExecute(Item));

    }


public interface ICommandableNestedCollection<T>
    {
        void OnExecute<T>(T item);
    }

因此,ViewModel实现了ICommandableNestedCollection接口,其中T是Item

MyViewModel : ICommandableNestedCollection<TakenPhotoModel>
{
  public void OnExecute<T>(T item)
  {
     //code
  }
}