9

我创建了一个树视图,它对我硬盘上的目录和文件进行建模。每个 treeviewItem 都有一个复选框,绑定到 isSelected 属性。我想要实现的是为每个父节点显示总文件数上的选定文件数(总共选择 12 个文件中的 10 / 12 10 个文件)。

有没有办法与 where property is ...进行绑定?

<ContentPresenter Content="{Binding MyItems.Count where MyItems.IsSelected, Mode=OneTime}"
                  Margin="2,0" />
4

2 回答 2

16

没有办法直接过滤绑定中的集合。但是,WPF 允许使用CollectionViewSource.

一种方法是在您的过滤器CollectionViewSource的资源中定义 a通过绑定到 this 的 Count 属性来获取通过过滤器的元素的数量。不过,您必须在代码隐藏中定义您的过滤器。看起来像这样:ItemTemplateItemsSourceCollectionViewSource

<TreeView x:Name="Tree" ItemsSource="{Binding Items}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding ChildItems}">
            <HierarchicalDataTemplate.Resources>
                <CollectionViewSource x:Key="FilteredItems" 
                                        Source="{Binding ChildItems}"
                                        Filter="FilteredItems_OnFilter" />
            </HierarchicalDataTemplate.Resources>
            <TextBlock>
                <TextBlock.Text>
                    <MultiBinding StringFormat="{} {0} of {1} selected">
                        <Binding Path="Count" Source="{StaticResource FilteredItems}" />
                        <Binding Path="ItemsSource.Count" ElementName="Tree" />
                    </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

在代码隐藏中:

private void FilteredItems_OnFilter(object sender, FilterEventArgs e)
{
    var item = sender as Item;
    e.Accepted = item.IsSelected;
}

我还没有测试过它,但它应该可以正常工作。但是,您永远不会知道 WPF...

于 2013-04-18T07:22:31.543 回答
-13

我个人使用以下框架 http://logofx.codeplex.com/ 似乎满足您的所有要求(使用 LogoFX.Mini,因为它似乎足以满足您的目的)。使用 WrappingCollection.WithSelection 作为您的 ItemsSource 使用 SelectionCount 作为您要显示的值。如果您决定不使用该框架,那么您应该通过专用行为订阅选择更改事件,创建专用依赖属性并在每次选择更改时更新它。

最后一件事:绝对避免使用代码隐藏。它打破了整个 MVVM 原则。

于 2013-04-18T08:00:31.997 回答