【问题标题】:WPF Tree View select items when added to treeWPF 树视图在添加到树时选择项目
【发布时间】:2010-10-31 20:08:08
【问题描述】:

我有一个显示我的 ViewModel 的 WPF TreeView。我有一个按钮,可以将项目添加到基础 ViewModel 中的集合中,从而将子节点添加到树中。这部分有效。

我想要的是新添加的项目作为树视图的 SelectedItem。

我已经读过这篇文章:How to programmatically select an item in a WPF TreeView? 但它不起作用,因为我添加到树中的项目不是 TreeViewItem,它们是我的模型中的类。

我也读过这个:Simplifying the WPF TreeView by Using the ViewModel Pattern 但是我不想为我添加到 TreeView 的每个项目创建一个 ViewModel。我觉得它会创建不必要的冗余对象。即我的 ViewModel 具有 IsSelected 属性,该属性包装了没有 IsSelected 属性的模型。这会导致在使用我的实际 ViewModel 时出现太多麻烦。

有没有办法告诉 TreeView 选择新添加的项目?以编程方式或通过 XAML。

谢谢。

【问题讨论】:

    标签: c# .net wpf xaml treeview


    【解决方案1】:

    我认为没有任何直接的方法可以将新添加的项目选择到 TreeView,因为 TreeView 本身不知道更改。 TreeViewItem 在扩展时生成,每个 TreeViewItem 本身就是一个 ItemsControl,为他们的孩子管理他们自己的容器。
    也许有可能在加载时扩展整个 TreeView 并获取每个容器的 ObservableCollection 然后侦听 CollectionChanged 事件,但是由于 View 不知道集合的类型,所以 IList 可能是它可以做的最好的而且我们没有 CollectionChanged 事件,所以我看不到它。但也许我错过了一些东西..

    无论如何,我会使用这种方法(我看到你已经研究过),因为它可能会给你带来最少的麻烦,但如果你想出一个比我更好的解决方案,我会很高兴知道什么是是:-)

    <TreeView ...>
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
            </Style>
        </TreeView.ItemContainerStyle>
    </TreeView>
    

    【讨论】:

    • 我将最终为 Tree 的每个子节点使用一个 ViewModel。但是为了给自己省点麻烦,这些 ViewModel 将只是扩展我的实际模型并实现一个包含我需要的 IsSelected 属性的 ITreeViewModel 接口。我真的不喜欢这个解决方案,但我想它现在可以工作。
    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 2015-01-28
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多