MVVMCross ListView - 如何仅使用匹配特定条件的列表项进行填充?

时间:2017-07-21 10:40:12

标签: xamarin.android mvvmcross

MVVMCross ListView - 如何显示按状态分组的列表视图中的项目列表?例如,激活或停用

我已经在布局中添加了两个listview,并使用xaml数据绑定和后面的代码将数据源设置为有两个列表(activatedItems和deactivatedItems =>这两个列表都是从ListOfItems派生的。)。但是当基础列表发生更改(ListOfItems)时,数据中的问题没有更新。

要解决此问题,我必须通过在数据集发生更改时设置内容视图来重新创建UI。

这不是一个优雅的解决方案,我希望有一个列表视图与部分"激活"和"停用"。然后触摸Activated项应该添加到Deactivated列表,UI应该反映相同。

2 个答案:

答案 0 :(得分:0)

由于您的LoginItemModel具有Title属性(让我们假定它属于string属性),我建议您将其解压缩为{ {1}}界面并添加ILoginItemModel属性。这样:

bool IsHeader

让您的public interface ILoginItemModel { public bool IsHeader { get; } public LoginSection ItemGroup { get; } public string Title { get; } } 扩展此LoginItemModel界面,并使ILoginItemModel始终返回IsHeader

false

写一个扩展同一界面的第二个类,让它称之为public bool IsHeader => false; 。这个类只有这三个属性:

LoginItemHeaderModel

现在我们有两个适合单public class LoginItemHeaderModel : ILoginItemModel { public bool IsHeader => true; LoginSection _itemGroup; public LoginSection ItemGroup => _itemGroup; string _title; public string Title => _title; public LoginItemHeaderModel(LoginSection itemGroup, string title) { _itemGroup = itemGroup; _title = title; } } 的模型。

回到您的视图模型,您可以声明第四个列表属性并将它们与新标题一起放在一起:

IList<ILoginItemModel>

现在您已经有了单个排序列表和部分标题列表。

您现在应该为这些标题项编写一个新的布局(不是要让它们看起来像普通项,对吗?),并且在自定义public List<ILoginItemModel> SectionedLoginItems { get { var values = Enum.GetValues(typeof(LoginSection)).Cast<LoginSection>(); List<ILoginItemModel> list = new List<ILoginItemModel>(); foreach (LoginSection loginSection : values) { list.Add(new LoginItemHeaderModel(loginSection, loginSection.ToString())); list.AddRange(LoginItems.Where(l => l.ItemGroup == loginSection)); } return list; } } 内,{{1 }}方法,检查MvxAdapter(将是GetBindableView个对象)是否是标题项。

答案 1 :(得分:0)

每当您对ActiveLoginItems或DeactivatedLoginItems进行更改时,请在ViewModel中调用RaisePropertyChanged,即

RaisePropertyChanged(() => ActiveLoginItems);

RaisePropertyChanged(() => DeactivatedLoginItems);

这应该使MvxListView随更改而更新。