Ivo*_*zor 2 android mvvm inotifycollectionchanged xamarin.android mvvmcross
我正在尝试在TwoWay模式下绑定MvxBindableListView,以便在ViewModel中设置它的值时通过Buttons的Click命令在View中更新.目前它只在布局在start/tabchange完全加载时更新...
该视图模型是:
public List<MyType> TestList
{
get { return _testList; }
set
{
_testList = value;
FirePropertyChanged("TestList");
}
}
Run Code Online (Sandbox Code Playgroud)
View中的.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" />
Run Code Online (Sandbox Code Playgroud)
数据绑定的工作方式是通过一个名为的接口 INotifyPropertyChanged
在这个接口中发生的是ViewModel在属性发生变化时发送View消息 - 例如
FirePropertyChanged("TestList");
Run Code Online (Sandbox Code Playgroud)
使用列表,如果列表本身的内容发生更改,则无效 - 例如,当列表中添加或删除了项目时.
为了解决这个问题,.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)的类当您添加/删除列表项时,它将触发正确的事件.
您可以在以下位置查看Mono ObservableCollection实现的源代码:https://github.com/mosa/Mono-Class-Libraries/blob/master/mcs/class/System/System.Collections.ObjectModel/ObservableCollection.cs - 它是值得花一些时间来看看这个实现,以便您可以更多地了解Mvvm如何与INotifyCollectionChanged一起使用.
如果您使用ObservableCollection类,那么您的代码将变为:
private ObservableCollection<MyType> _testList;
public ObservableCollection<MyType> TestList
{
get { return _testList; }
set
{
_testList = value;
FirePropertyChanged("TestList");
// in vNext use RaisePropertyChanged(() => TestList);
}
}
Run Code Online (Sandbox Code Playgroud)
有:
<Mvx.MvxBindableListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
local:MvxBind="{'ItemsSource':{'Path':'TestList'}}"
local:MvxItemTemplate="@layout/my_item_layout" />
Run Code Online (Sandbox Code Playgroud)
注意:
OneWay- 这意味着绑定仍然只是从ViewModel到View - 没有从View到ViewModel的更新.InvokeOnMainThread(() => { /* do work here */ })ViewModel 将工作重新编写回UI线程.对于较大的集合 - 您不希望同时在内存中的所有项目 - 您可能需要自己实现一些数据存储支持的列表.
在https://github.com/slodge/MvvmCross/blob/vnext/Sample%20-%20SimpleDialogBinding/SimpleDroidSql.Core/DatabaseBackedObservableCollection.cs中有一个简单的sqlite数据支持商店的简短示例.
这种集合数据的虚拟化在WP和WPF应用程序中很常见 - 例如,请参阅问题和答案,例如在WP7 Mango中默认情况下列表框是否已虚拟化?
| 归档时间: |
|
| 查看次数: |
1051 次 |
| 最近记录: |