我正在尝试在 TwoWay 模式下绑定 MvxBindableListView ,以便在我设置它的值时在视图中进行更新 ViewModel (通过Buttons的Click命令)。 目前它只在布局在start / tabchange ...
完全加载时更新ViewModel 是:
public List<MyType> TestList
{
get { return _testList; }
set
{
_testList = value;
FirePropertyChanged("TestList");
}
}
视图中的.axml是:
<Mvx.MvxBindableListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
local:MvxBind="{'ItemsSource':{'Path':'TestList','Mode':'TwoWay'}}"
local:MvxItemTemplate="@layout/my_item_layout" />
答案 0 :(得分:5)
数据绑定的工作方式是通过名为INotifyPropertyChanged
此界面中发生的情况是ViewModel在属性发生变化时发送View消息 - 例如
FirePropertyChanged("TestList");
使用列表,如果列表本身的内容发生变化,这无济于事 - 例如当列表中添加或删除了一个项目时。
要解决此问题,.Net Mvvm实现包括另一个接口INotifyCollectionChanged
。
集合(例如列表)可以实现INotifyCollectionChanged
,以便让View知道集合的内容何时发生变化。
例如,该集合可能会触发包含提示的事件,例如:
在12:30左右进入MvvmCross Xaminar http://www.youtube.com/watch?v=jdiu_dH3z5k
这个界面的简短介绍
将此接口用于小型内存列表 - 例如少于1000个“小”对象 - 您所要做的就是更改List<T>
ObservableCollection<T>
- ObservableCollection是来自核心.Net库(来自Microsoft或Mono)的类,它将会添加/删除列表项时触发正确的事件。
您可以在https://github.com/mosa/Mono-Class-Libraries/blob/master/mcs/class/System/System.Collections.ObjectModel/ObservableCollection.cs中看到Mono ObservableCollection实现的源代码 - 值得花一些时间来查看此实现,以便您可以更多地了解Mvvm如何与INotifyCollectionChanged一起使用。
如果您使用ObservableCollection类,那么您的代码将变为:
private ObservableCollection<MyType> _testList;
public ObservableCollection<MyType> TestList
{
get { return _testList; }
set
{
_testList = value;
FirePropertyChanged("TestList");
// in vNext use RaisePropertyChanged(() => TestList);
}
}
使用:
<Mvx.MvxBindableListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
local:MvxBind="{'ItemsSource':{'Path':'TestList'}}"
local:MvxItemTemplate="@layout/my_item_layout" />
注意:
OneWay
- 这意味着绑定仍然只是从ViewModel转到View - 从View到ViewModel的没有更新。InvokeOnMainThread(() => { /* do work here */ })
将工作重新编写回UI线程。对于较大的集合 - 您不希望同时在内存中的所有项目 - 您可能需要自己实现一些数据存储支持列表。
中有一个简单的sqlite数据支持商店的简短示例这种集合数据的虚拟化在WP和WPF应用程序中很常见 - 例如查看Is listbox virtualized by default in WP7 Mango?
等问题和答案答案 1 :(得分:0)
我们刚刚找到了适合我们的解决方法!!
注意:在列表中添加和删除会使用新/已删除项更新视图。但是,没有反映对现有项目状态的任何更改。
解决方案:我们清除了列表,并将项目重新添加到ViewModel属性并更新了状态。调用raisepropertychanged然后模仿双向绑定行为。基本上它是删除所有值并重新添加所有值。