我正在尝试将来自相关数据表customers<-products的信息表示到treeview中。
由于性能问题,我想使用后台工作者,但有一个陷阱-没有图形用户界面单元(也可以在其他线程,而不是STA的TreeViewItem )。
所以我定义了自己的“STA-线程安全”类:
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上没有反应。
感谢任何人的帮助!非常感谢您的提前!
发布于 2013-09-24 15:31:13
考虑给你的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 treeview,但我想.NET treeview也可以做同样的事情。
发布于 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解决方案。
<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>https://stackoverflow.com/questions/18975304
复制相似问题