MVVMCross ListView - 如何显示按状态分组的列表视图中的项目列表?例如,激活或停用
我已经在布局中添加了两个listview,并使用xaml数据绑定和后面的代码将数据源设置为有两个列表(activatedItems和deactivatedItems =>这两个列表都是从ListOfItems派生的。)。但是当基础列表发生更改(ListOfItems)时,数据中的问题没有更新。
要解决此问题,我必须通过在数据集发生更改时设置内容视图来重新创建UI。
这不是一个优雅的解决方案,我希望有一个列表视图与部分"激活"和"停用"。然后触摸Activated项应该添加到Deactivated列表,UI应该反映相同。
答案 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随更改而更新。