我试图将相关数据表客户< -products的信息表示为树视图。
由于性能问题我想使用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没有反应。
任何帮助表示赞赏!非常感谢你提前!
答案 0 :(得分:2)
考虑将触发器添加到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树视图做同样的事情。
答案 1 :(得分:0)
我自己解决了,感谢Nadeem_MK的暗示......
首先,我使用事件设置器添加带有感叹号的简单点击事件弹出消息框。这工作显示出奇怪的效果 - 我stil有父元素,可以扩展,但点击后整个组(父母与扩展的孩子突出显示)...
这也是模板表示的一个问题 - 不是分层视图,而只是colapsing元素列表......
所以这是解决方案 - 纯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>