2014-11-14 3 views
0

트리 뷰에 표시 할 FilterViewModel 목록이 있습니다. FilterViewModel에는, FilterViewModel 형의 Children 콜렉션이있어, 각 FilterViewModel는 체크 가능합니다. 트 리뷰가 작성되면XViewModel 목록을 X 목록으로 변환

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에 모델을 드러내는 일을 혼란스럽게 할 것입니다 ...

답변

1

나는 ViewModelModel 객체를 노출하는 것이 나쁜 습관이라고 말하지 않았을 것입니다. View에서 사용해보십시오.

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; 
} 
: 이미 모든 Filter 개체의 목록이있는 경우

그러나 IsChecked를 설정 거의 같은 방법으로이 작업을 수행 할 수 있어야한다

관련 문제