在我当前的WPF MVVM设置中,我有一个树形视图,它从文件/文件夹目录中填充。包括子文件夹和文件。但是我想实现一个简单的“收藏夹”功能。这意味着我可以单击树视图中每个文件的复选框,然后当我单击UI中的主“复选框”时,它将过滤列表以仅显示'favorties'。
这似乎是一个普遍的问题,但我该怎么做呢?组织和绑定UI?
我已经将解决方案'visual studio 2013'发布到我的Dropbox,供所有愿意帮助我的人使用。
我的猜测是添加另一个ObservableCollection,它存储作为favorties检查的节点和原始的treeview节点。因此,当用户启用main复选框时,它会将favouries列表加载到ui,当取消选中时,它会重新加载树视图。
// collection of nodes which you see in the image below on the left
public ObservableCollection<INode> DisplayNodes //nodes displayed in UI
public ObservableCollection<INode> FavoriteNodes //nodes marked as favorites
public ObservableCollection<INode> StructureNodes //system node structure
下面的伪函数
public void PopulateUI()
{
DisplayNodes.Clear();
if (showFavorites.isChecked)
{
DisplayNodes = FavoriteNodes;//nodes displayed in UI
}else{
DisplayNodes = StructureNodes;
}
}
答案 0 :(得分:1)
我无法从工作中下载您的项目,但我可以就此为您提供一些一般性指导。
这可以通过修改您的INode实现(FileNode,DirectoryNode等)以包含IsFavorite
bool属性来完成。
在视图模型中,添加名为FavoritesEnabled
的属性。在该属性的setter中,您可以使用已过滤的INode集合替换RootNodes
可观察集合。
private bool favoritesEnabled;
public bool FavoritesEnabled
{
get
{
return this.favoritesEnabled;
}
set
{
this.favoritesEnabled = value;
this.RootNodes = value == true
? new ObservableCollection(this.FilterFavorites)
: new ObservableCollection(this.CreateRootNodes);
}
}
private IEnumerable<INode> FilterFavorites()
{
List<INode> nodes = new List<INode>();
foreach(DirectoryNode directory in this.RootNodes.OfType<DirectoryNode>())
{
nodes.AddRange(this.filterFavorites(nodes, directory.Children.OfType<DirectoryNode>());
nodes.AddRange(this.RootNodes.OfType<FileNode>().Where(item => item.IsFavorite);
}
}
private List<INode> FilterFavorites(List<INode> filteredResults, IEnumerable<DirectoryInfo> directories)
{
// Recursively look up all favorites.
foreach(DirectoryNode directory in directories)
{
filteredResults.AddRange(FilterFavorites(filteredResults, directory));
}
nodes.AddRange(this.RootNodes.OfType<FileNode>().Where(item => item.IsFavorite);
return filteredResults;
}
然后,您只需更新树视图的数据模板,以便每个项的复选框都与数据绑定到INode实现上的IsFavorite属性。
上面的递归代码或多或少是伪造的,因为我无法在不降低项目的情况下对其进行测试。它应该有助于您开始朝着正确的方向前进。使用此方法,您可以继续维护单个集合。您需要将RootNodes
属性的创建移出构造函数并转换为可重用的方法。这样,当您在视图模型中切换收藏夹属性时,您的RootNodes
集合会生成收藏的收藏集,或者#34; all&#34;集合。
如果你无法让它发挥作用,我今晚可以在家里抓住你的东西并给出一个正确的例子。