2015-09-20 191 views
2

我一直在试图隐藏TreeView的项目。我使用自定义数据类型作为从FrameworkElement继承的源(称为SettingsMenuItem)(当前是FrameworkContentElement,因为否则TreeView呈现错误)。隐藏TreeView项目

我的目标是通过这些FrameworkElements的VisibilityProperty设置要么CollapsedVisible我能够隐藏某些项目(包括子女)。我知道这可以通过从源集合中删除项目来完成。但那不是我想要的。这意味着我必须对每个集合进行镜像以便跟踪它的实际项目,绑定到每个集合以便通知Visibility-更改并在每次更改时创建一个新集合。这很多开销。

现在我不知道如何才能做到这一点。我认为它与ItemsGenerator有关,但我没有看到覆盖它的行为的任何可能性。我认为TreeView能够检测可见性,但显然它没有。作为另一种选择,我想到了一个自定义的TreeViewItem(如果需要的话,甚至可能是TreeView) - 但是在这一点上,整个系统的抽象使我感到压力。我不知道从哪里开始,以及解决问题的实际必要性。

提示我必须自己改变或实施将是绰绰有余。一个完整的解决方案会很好。

+0

需要查看一些代码来提出修复建议。你有没有用XAML编写的HierarchicalDataTemplate可以包含在你的问题中? –

+2

这并不像通常那样做。通常使用ICollectionView&设置过滤器谓词来完成过滤。使用TreeView时,这会稍微复杂 - 因为您需要在每种数据类型中都有一个ICollectionView。您不应该需要从FrameworkElement继承。除非您正在推出一些与现有TreeView截然不同的疯狂自定义TreeView,并且您无法通过替换Templates来表示这种差异。但是,我几乎可以保证,你不需要这样做。 – user3690202

+0

这就是我一直在寻找的。我已经这么想过了。我没有严格使用MVVM,但我知道使用TreeViews和其他数据视图控件并没有使用它(或至少它的某些事情)是没有意义的。无论如何,我按照您建议的方式解决了它@ user3690202:我使用了一个CollectionView,它使用每个实例中指定的代理来过滤那些应该隐藏的代理。 – SharpShade

回答

3

你可以使用你的树数据节点绑定到一个属性(例如“可见性”)数据触发做到这一点:

<TreeView.ItemContainerStyle> 
    <Style TargetType="{x:Type TreeViewItem}"> 
     <Setter Property="Visibility" Value="Visible" /> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding IsVisible}" Value="False"> 
       <Setter Property="Visibility" Value="Collapsed" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</TreeView.ItemContainerStyle> 

尽管这在技术上回答你的问题,我会小心的实际去做。 User3690202的评论是正确的,这通常是通过在视图模型中进行过滤来完成的。

+0

谢谢,我很感激。我使用了使用CollectionViews的建议方法。 – SharpShade

+0

我想补充一点,虽然这是“通常通过在视图模型中过滤来完成的事情”,但在许多情况下,在视图中执行操作也是合理的。该视图负责呈现数据;如果设计师有充分的理由根据一些基本标准来选择“根本不可能”的选择(或许用其他方式替代?),那么这也是公平的。 – Dan