2014-11-14 25 views
0

我有一個FilterViewModel的列表,我在樹形視圖中顯示。 FilterViewModel具有一系列Children,它們也是FilterViewModel類型,每個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在層次結構中的列表。

有沒有人知道一個快速解決方案?我假設這將是不好的做法,並可能會混淆視圖模型上的事項,以揭露視圖模型...

回答

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