WPF绑定列表视图复选框显示为收藏夹

时间:2015-10-22 16:47:32

标签: c# wpf mvvm treeview

在我当前的WPF MVVM设置中,我有一个树形视图,它从文件/文件夹目录中填充。包括子文件夹和文件。但是我想实现一个简单的“收藏夹”功能。这意味着我可以单击树视图中每个文件的复选框,然后当我单击UI中的主“复选框”时,它将过滤列表以仅显示'favorties'。

这似乎是一个普遍的问题,但我该怎么做呢?组织和绑定UI?

我已经将解决​​方案'visual studio 2013'发布到我的Dropbox,供所有愿意帮助我的人使用。

Download Dropbox Files

我的猜测是添加另一个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;
    }
}

enter image description here

1 个答案:

答案 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;集合。

如果你无法让它发挥作用,我今晚可以在家里抓住你的东西并给出一个正确的例子。