我在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中我可以绑定祖先`数据上下文是否可能存在?
答案 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
}
}