【问题标题】:Tree structure as a ItemsControl's ItemsSource作为 ItemsControl 的 ItemsSource 的树结构
【发布时间】:2012-08-31 09:41:03
【问题描述】:

我正在尝试将一个简单的树结构绑定到 Win 8(以前称为)Metro 应用程序中的 ItemsControl 的 itemsSource。 我的结构实现了 INotifyPropertyChanged 接口,并在它的任何子项发生更改时通知。

我尝试制作一个转换器,将我的树展平为 ObservableCollection,但在创建绑定后,它不会刷新。

我做了以下测试项目来展示我想要什么: https://skydrive.live.com/redir?resid=970FFC53F4B7A598!146

这个简单项目的问题是,如果你按下底部应用栏上的添加按钮,它会在层次结构中创建一个新的子级,但 ListView 不会刷新。

我错过了什么,或者我该怎么做?

【问题讨论】:

    标签: c# wpf windows-8 windows-runtime winrt-xaml


    【解决方案1】:

    使用DataTemplate 应该相当简单,例如

    <DataTemplate DataType="{x:Type local:TreeItemType}">
        <StackPanel>
            <ContentPresenter Content="{Binding Name}"/>
            <ItemsControl ItemsSource="{Binding Children}"/>
        <StackPanel>
    <DataTemplate>
    

    通过ItemsControl.Resources 隐式应用它(因此它也被应用到内部ItemsControl


    如果您只是想要叶子或对不是单个单元的项目提出问题,您可以构造一个CompositeCollection,而不是创建一个永远不会修改的ObservableCollection 的转换器,因为只有视图有对其的引用,您可以通过CollectionContainers 包装原始集合,通知将被保留。

    【讨论】:

    • 能否请您发布一个包含 CompositeCollection 和 CollectionContainers 解决方案的示例?
    • 嗯。我想 WinRT 中没有 CompositeCollection 和 CollectionContainer 类。我的问题是,我有一个面板,它定制了它的孩子的布局。它很容易与 ItemsControl 一起使用,但如果我使用上面的解决方案保持层次结构,我不知道如何进行布局。
    • @adam_gav:很不幸,您当然可以实现自己的。我想我已经充分解释了转换器的问题,您需要保留对原始集合的引用并对他们的CollectionChanged 事件做出反应。复合集合仅转发其子集合的事件。
    猜你喜欢
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多