简体   繁体   English

不会使用自定义数据触发Treeview SelectedItemChanged

[英]Treeview SelectedItemChanged is not fired with custom data

I am trying to represent information from related datatables customers<-products into a treeview. 我试图将相关数据表客户<-products的信息表示到树视图中。

Due to performance issues I wanted to use Backgroundworker, but there is a gotcha - no GUI units (also TreeViewItem in other thread than STA possible). 由于性能问题,我想使用Backgroundworker,但是有一个问题 - 没有GUI单元(除了STA之外的其他线程中也可以使用TreeViewItem)。

So I defined my own "STA-thread-safe" class: 所以我定义了自己的“STA-thread-safe”类:

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()
    {         
    }

}
}

And an Template in XAML for representing: XAML中的模板用于表示:

<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>

It is working so far - showing populated tree with subitems as wished. 它到目前为止工作 - 显示人口密集的树与子项目一样希望。 Also expanding/collapsing works... 扩展/折叠工作......

BUT - no event is risen - there is no reaction on SelectedItemChanged. 但是 - 没有事件发生 - SelectedItemChanged没有任何反应。

Any help appreciated! 任何帮助赞赏! Thank you very much in advance! 非常感谢你提前!

Consider adding a Trigger to your treeView (.xaml); 考虑将一个Trigger添加到treeView(.xaml);

<i:Interaction.Triggers>
   <i:EventTrigger EventName="Selected">
       <cmdex:EventToCommand Command="{Binding ExecutionCommand}"
        PassEventArgsToCommand="True" />
     </i:EventTrigger>
</i:Interaction.Triggers>

Where 哪里

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

and

xmlns:cmdex="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF4"

Then you can code your command easily. 然后,您可以轻松编写命令。 The only difference is that I'm using a Telerik treeview but I suppose the same thing can be done to a .NET treeview. 唯一的区别是我使用的是Telerik树视图,但我认为可以对.NET树视图做同样的事情。

I solved it myself, thanks to the hint of Nadeem_MK... 我自己解决了,感谢Nadeem_MK的暗示......

First I used event setter to add simple click event poping up message box with exclamation mark. 首先,我使用事件设置器添加带有感叹号的简单点击事件弹出消息框。 This worked showing strange effect - I stil had parent element, that can be expanded, but after click the whole group (parent with expanded children was highlighted)... 这工作显示出奇怪的效果 - 我stil有父元素,可以扩展,但点击后整个组(扩展孩子的父母突出显示)...

Also it is an issue with the template representation - not an hierarchical view, but just list of colapsing elements... 此外,它是模板表示的问题 - 不是分层视图,而只是colapsing元素的列表......

So here is the solution - pure XAML - based on http://blogs.msdn.com/b/mikehillberg/archive/2009/10/30/treeview-and-hierarchicaldatatemplate-step-by-step.aspx 所以这里是解决方案 - 纯XAML - 基于http://blogs.msdn.com/b/mikehillberg/archive/2009/10/30/treeview-and-hierarchicaldatatemplate-step-by-step.aspx

            <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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 WPF 自定义 TreeView 控件的 SelectedItemChanged 事件 - SelectedItemChanged event for WPF custom TreeView control 处理SelectedItemChanged TreeView - Handling SelectedItemChanged TreeView treeView_selectedItemChanged事件处理程序 - treeView_selectedItemChanged event handler 在SelectedItemChanged事件中更改WPF TreeView SelectedItem - Changing WPF TreeView SelectedItem in SelectedItemChanged event 如何以编程方式调用treeView.SelectedItemChanged - How to call treeView.SelectedItemChanged programmatically 在树视图中处理具有多种对象类型的SelectedItemChanged - Handle SelectedItemChanged in a treeview with multiple object types DataGrid填充TreeView的SelectedItemChanged上的空白行 - DataGrid populating blank rows on TreeView's SelectedItemChanged 触发Treeview的SelectedItemChanged事件时,如何聚焦两个文本框? - How to Focus Two Text Boxes as SelectedItemChanged event of Treeview is triggerd? 用于 TreeView SelectedItemChanged 事件的 Caliburn Micro“找不到方法事件的目标...” - Caliburn Micro “No target found for method Event…” for TreeView SelectedItemChanged event Treeview.Items.Clear() 方法在 SelectedItemChanged 事件中返回 null 异常(e.NewValue==null) - Treeview.Items.Clear() method return null exception (e.NewValue==null) in SelectedItemChanged Event
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM