将 XViewModel 的列表转换为 X 的列表
本文关键字:列表 转换 XViewModel | 更新日期: 2023-09-27 18:30:33
我有一个在树视图中显示的 FilterViewModel 列表。FilterViewModel 有一个子项的集合,这些子项的类型也是 FilterViewModel,每个 FilterViewModel 都是"可检查的"。这样:
public abstract class FilterViewModel
{
public string ID { get; set; }
public virtual IEnumerable<FilterViewModel> Children { get; private set; }
public bool? IsChecked { get; set; }
private FilterModel _filter;
public FilterViewModel(Filter filter, IEnumerable<Filter> checkedFilters)
{
_filter = filter;
CheckFilters(checkedFilters);
}
}
创建树视图时,将像这样检查相应的筛选器:
private void SetChildrenChecked(IEnumerable<Filter> filters,
IEnumerable<FilterViewModel> visibleList)
{
foreach (var filter in filters)
{
foreach (var filterVM in visibleList
.Where(filterVM => filter.ID == filterVM.ID))
{
if (filter.Children.Any())
{
SetChildrenChecked(filter.Children, filterVM.Children);
}
else
{
filterVM.Children.ForEach(c => c.IsChecked = true);
}
}
}
}
但是,我正在努力找出相反的最佳方法 - 为层次结构中的每个选中的 FilterViewModel 返回一个列表。
有谁知道快速的解决方案?我认为这将是不好的做法,并且可能会混淆在视图模型上公开模型的问题......
我不会说在ViewModel
上公开Model
对象是一种不好的做法,只要您不尝试从View
使用它。
但是,如果您已经拥有所有Filter
对象的列表,则应该能够以与设置IsChecked
大致相同的方式执行此操作:
private IEnumerable<Filter> GetChildrenChecked(IEnumerable<Filter> filters, IEnumerable<FilterViewModel> visibleList)
{
List<Filter> returnValue = new List<Filter>();
foreach (var filter in filters)
{
foreach (var filterVM in visibleList
.Where(filterVM => filter.ID == filterVM.ID))
{
if (filter.Children.Any())
{
returnValue.AddRange(GetChildrenChecked(filter.Children, filterVM.Children));
}
else
{
if (filterVM.IsChecked)
returnValue.Add(filter);
}
}
}
return returnValue;
}