【问题标题】:Treeview SelectedItemChanged is not fired with custom dataTreeview SelectedItemChanged 不使用自定义数据触发
【发布时间】:2013-09-24 07:19:31
【问题描述】:

我正在尝试将来自相关数据表客户

由于性能问题,我想使用 Backgroundworker,但有一个问题 - 没有 GUI 单元(也可能是 STA 之外的其他线程中的 TreeViewItem)。

所以我定义了自己的“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()
    {         
    }

}
}

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>

到目前为止它正在工作 - 根据需要显示带有子项的填充树。也可以展开/折叠作品...

但是 - 没有事件发生 - SelectedItemChanged 没有反应。

任何帮助表示赞赏!非常感谢您!

【问题讨论】:

    标签: c# wpf treeview customization selecteditemchanged


    【解决方案1】:

    考虑将触发器添加到您的 treeView (.xaml);

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

    在哪里

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

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

    然后您可以轻松编写命令。唯一的区别是我使用的是 Telerik 树视图,但我认为可以对 .NET 树视图执行相同的操作。

    【讨论】:

    • 很抱歉,但我无法找到所需的实例......其中定义了“i:”和“cmdex:”......我也尝试过 EventSetter 但无济于事。 ..
    • 非常感谢您抽出宝贵时间,我自己解决了,但您的提示给了我正确的寻找方向...
    • 不客气 ;) 我的回答是为了提供提示,因为我们没有使用相同的控件。
    【解决方案2】:

    我自己解决了,感谢 Nadeem_MK 的提示...

    首先我使用事件设置器添加简单的点击事件弹出带有感叹号的消息框。这显示出奇怪的效果 - 我仍然有可以展开的父元素,但是在单击整个组后(突出显示了展开子的父元素)...

    这也是模板表示的问题 - 不是分层视图,而只是折叠元素的列表...

    所以这里是解决方案 - 纯 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>
    

    【讨论】:

      猜你喜欢
      • 2011-09-29
      • 1970-01-01
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多