我有一个我在树视图中显示的FilterViewModel列表。 FilterViewModel有一个Children集合,它们也是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返回一个List。
有谁知道快速解决方案?我认为这将是不好的做法,并且可能会混淆在ViewModel上暴露模型的问题......
答案 0 :(得分:1)
我不会说在Model
上公开ViewModel
对象是不好的做法,只要你没有尝试从View
使用它。
但是,如果您已经拥有所有IsChecked
个对象的列表,那么您应该能够像设置Filter
一样执行此操作:
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;
}