首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用自定义数据触发树视图SelectedItemChanged

不使用自定义数据触发树视图SelectedItemChanged
EN

Stack Overflow用户
提问于 2013-09-24 15:19:31
回答 2查看 1.3K关注 0票数 0

我正在尝试将来自相关数据表customers<-products的信息表示到treeview中。

由于性能问题,我想使用后台工作者,但有一个陷阱-没有图形用户界面单元(也可以在其他线程,而不是STA的TreeViewItem )。

所以我定义了自己的“STA-线程安全”类:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace XXX.YYY
{
public class TreeViewNode: INotifyPropertyChanged
{
    #region [ Header ]
    private string _header;
    public string Header
    {
        get
        {
            return _header;
        }

        set
        {
            _header = value;
            OnNotifyPropertyChanged("Header");
        }
    } 
    #endregion

    #region [ Tag ]
    private string _tag;
    public string Tag
    {
        get
        {
            return _tag;
        }

        set
        {
            _tag = value;
            OnNotifyPropertyChanged("Tag");
        }
    } 
    #endregion

    #region [ Items ]
    private ObservableCollection<TreeViewNode> _items;

    public ObservableCollection<TreeViewNode> Items
    {
        get
        {
            if (_items == null)
            {
                _items = new ObservableCollection<TreeViewNode>();
            }

            return _items;
        }

        set
        {
            _items = value;
            OnNotifyPropertyChanged("Items");
        }
    } 
    #endregion

    #region [ Property_Changed_Utilities ]
    public event PropertyChangedEventHandler PropertyChanged;

    private void OnNotifyPropertyChanged(String info)
    {
        // Note: Do not forget to add interface 
        // "INotifyPropertyChanged" to your class.
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
    #endregion

    public TreeViewNode()
    {         
    }

}
}

以及XAML中用于表示以下内容的模板:

代码语言:javascript
复制
<TreeView Name="treeview"
      ItemsSource="{Binding RelativeSource=
          {RelativeSource Mode=FindAncestor,AncestorType=Window},
      Path=TreeViewData}"
      SelectedItemChanged="treeview_SelectedItemChanged">

    <TreeView.Resources>
        <Style TargetType="TreeViewItem">
            <Setter Property="ItemTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <TreeViewItem Header="{Binding Header}" 
                                      ItemsSource="{Binding Items}" />
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </TreeView.Resources>
    <TreeView.ItemTemplate>
        <DataTemplate>
            <TreeViewItem Header="{Binding Header}" 
                          ItemsSource="{Binding Items}" />
        </DataTemplate>
    </TreeView.ItemTemplate>

到目前为止,它是有效的--根据需要显示带有子项的填充树。还有展开/折叠工作...

但是-没有事件上升-在SelectedItemChanged上没有反应。

感谢任何人的帮助!非常感谢您的提前!

EN

回答 2

Stack Overflow用户

发布于 2013-09-24 15:31:13

考虑给你的treeView (.xaml)添加一个触发器;

代码语言:javascript
复制
<i:Interaction.Triggers>
   <i:EventTrigger EventName="Selected">
       <cmdex:EventToCommand Command="{Binding ExecutionCommand}"
        PassEventArgsToCommand="True" />
     </i:EventTrigger>
</i:Interaction.Triggers>

哪里

代码语言:javascript
复制
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

代码语言:javascript
复制
xmlns:cmdex="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF4"

然后你就可以轻松地编写你的命令了。唯一的区别是我使用的是Telerik treeview,但我想.NET treeview也可以做同样的事情。

票数 2
EN

Stack Overflow用户

发布于 2013-09-24 16:32:16

多亏了Nadeem_MK的提示,我自己解决了这个问题。

这显示了奇怪的效果-我仍然有父元素,可以展开,但在单击整个组后(具有展开的子代的父代突出显示)...

这也是模板表示的一个问题--不是分层视图,而仅仅是元素列表……

因此,这是一个基于http://blogs.msdn.com/b/mikehillberg/archive/2009/10/30/treeview-and-hierarchicaldatatemplate-step-by-step.aspx的纯XAML解决方案。

代码语言:javascript
复制
            <TreeView Name="treeview"
                      ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
                                                                           AncestorType=Window},
                                            Path=TreeViewData}"
                      SelectedItemChanged="treeview_SelectedItemChanged">

                <!--  Supplier teamplate  -->
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Items}">
                        <TextBlock Text="{Binding Header}" />

                        <!--  Products template  -->
                        <HierarchicalDataTemplate.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Header}" />
                            </DataTemplate>
                        </HierarchicalDataTemplate.ItemTemplate>

                    </HierarchicalDataTemplate>

                </TreeView.ItemTemplate>

            </TreeView>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18975304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档