将XViewModel列表转换为X列表

时间:2014-11-14 14:50:49

标签: c# wpf treeview

我有一个我在树视图中显示的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上暴露模型的问题......

1 个答案:

答案 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;
}