2017-03-17 81 views
0

我已经在Android中创建了MvxListView。我将它绑定到ObservableCollection。MvxListView - 模板内的按钮

一切工作正常。即使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照片和评论性具有约束力。

public MvxCommand RemoveCommand { get; set; } 

但是RemoveCommand does not fires。有任何想法吗?

编辑:

当我add命令我的模型及其工作这就是为什么特性结合。那么我怎么能在ViewModel不是Model中存档事件?

在XAML中,我可以绑定祖先数据上下文吗?

回答

0

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

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

但是,最近我只是为我的列表视图项目创建一个包装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); 
      }); 
     } 
    } 
} 
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); 
    } 

因此视图模型实现ICommandableNestedCollection接口,其中T是项目

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