代码之家  ›  专栏  ›  技术社区  ›  OrPaz

WPF事件、命令或同时使用两者

  •  2
  • OrPaz  · 技术社区  · 16 年前

    我正在构建我的应用程序基础结构,发现很难实现一个非常基本的行为——我想从系统中的不同用户控件引发事件,并能够在侦听这些事件的其他用户控件上捕获这些事件。例如,我有一个实现TreeView的用户控件。我有另一个实现ListView的用户控件。现在,我想让我的ListView监听TreeView,当TreeView上的选择被更改时,我想相应地重新填充我的ListView。 我还希望即使ListView不在WPF逻辑树的TreeView中,也会发生这种情况。

    请帮忙!!

    奥兰

    2 回复  |  直到 15 年前
        1
  •  2
  •   Nir    16 年前

    如果列表视图的内容存储在树视图中显示的对象中,则可以绑定到tree SelectedItem属性中。

    否则,将树SelectedItem绑定到视图模型(或窗口)中的属性并在此属性的setter中更改绑定到列表视图ItemSource属性的列表。

    this series on my blog 我链接到的文章是最后一篇带有代码下载链接的文章,如果你想得到完整的解释,你需要从系列文章的开头开始阅读。

    编辑: 我在一个项目中是这样做的:(GridView定义被删除了,因为它在这里不相关)

        <TreeView 
            Name="FolderTree" 
            Width="300" 
            ItemsSource="{Binding Root.SubFolders}"
            ItemTemplate="{StaticResource FolderTemplate}"/>
        <ListView 
            Name="FileView"
            ItemsSource="{Binding ElementName=FolderTree, Path=SelectedItem.Files}">
        </ListView>
    

    绑定到树视图的ItemsSource中的列表是具有3个属性的对象:名称(绑定到FolderTemplate中的TextBlock)、子文件夹(同样绑定到HierarchicalDataTemplate.ItemsSource属性)和使用绑定到ListView的文件 {Binding ElementName=FolderTree, Path=SelectedItem.Files}

    请注意,这些列表中没有一个是可观察的集合(因为在这个项目中,它们从不更改),但是由属性getter延迟(按需)加载(因为在这个项目中,它们的加载成本很高)。

        2
  •  2
  •   Cylon Cat    16 年前

    这正是MVVM(Model-View-ViewModel-pattern)所增加的复杂性开始得到回报的地方。您需要的是发布/订阅基础结构,以及 MVVM Light 还有一个很好的MVVM结构,它不会变得过于复杂。 Prism