将 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 返回一个列表。

有谁知道快速的解决方案?我认为这将是不好的做法,并且可能会混淆在视图模型上公开模型的问题......

将 XViewModel 的列表转换为 X 的列表

我不会说在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;
}