2

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

请帮忙!!

谢谢,奥兰

4

2 回答 2

2

这就是 MVVM(模型-视图-视图模型模式)增加的复杂性可以开始得到回报的地方。您需要的是一个发布/订阅基础架构,而MVVM Light拥有它,以及不会变得过于复杂的良好 MVVM 结构。Prism是另一个具有发布和订阅支持的优秀 WPF/Silverlight 基础架构基础。

于 2010-07-11T14:31:32.530 回答
2

使用数据绑定。

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

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

您可以在我的博客上看到本系列中的技​​术,我链接到的文章是带有代码下载链接的最后一篇文章,如果您想要完整的解释,您需要从本系列的开头阅读。

编辑:这是我在一个项目中的做法:(删除了 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)、SubFolders(同样绑定到 HierarchicalDataTemplate.ItemsSource 属性)和绑定到 ListView 的文件使用{Binding ElementName=FolderTree, Path=SelectedItem.Files}

请注意,所有列表都不是可观察的集合(因为在这个项目中它们永远不会改变),而是由属性 getter 延迟(按需)加载(因为在这个项目中它们的加载成本很高)。

于 2010-07-11T15:13:13.360 回答