C# 手动将项目添加到树视图时是否加载项目模板?
我正在手动创建我的节点(TreeViewItems),我的意思是在代码隐藏中。我这样做是因为我在扩展时按需放置子项,并且我必须添加一个虚拟节点。这就是我手动添加项目的原因 现在,重要的是,当我创建一个TreeViewItem时,它不会显示DataTemplate并显示默认值。“输出”窗口没有显示任何信息C# 手动将项目添加到树视图时是否加载项目模板?,c#,wpf,xaml,treeview,itemtemplate,C#,Wpf,Xaml,Treeview,Itemtemplate,我正在手动创建我的节点(TreeViewItems),我的意思是在代码隐藏中。我这样做是因为我在扩展时按需放置子项,并且我必须添加一个虚拟节点。这就是我手动添加项目的原因 现在,重要的是,当我创建一个TreeViewItem时,它不会显示DataTemplate并显示默认值。“输出”窗口没有显示任何信息 DataTemplate dt1 = this.Resources["exerciseSetTemplate"] as DataTemplate; foreac
DataTemplate dt1 = this.Resources["exerciseSetTemplate"] as DataTemplate;
foreach (var qs in qss)
{
TreeViewItem tvi = new TreeViewItem();
tvi.Header = qs.SetName;
tvi.Tag = qs;
tvi.ItemTemplate = dt1;
tvi.Items.Add(yourDummyNode);
treeView1.Items.Add(tvi);
}
以下是我的XAML代码:
<UserControl.Resources>
<DataTemplate x:Key="questionSetTemplate">
<StackPanel Orientation="Horizontal" Height="20" Margin="2,0,2,0">
<Image Width="16" Height="16" Source="{StaticResource FolderImage}" Margin="0,0,5,0" />
<TextBlock Text="{Binding SetName}" />
</StackPanel>
</DataTemplate>
</UserControl.Resources>
<Grid>
<TreeView x:Name="treeView1" TreeViewItem.Expanded="treeView1_Expanded_1"
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
</TreeView>
</Grid>
如何显示数据模板?您忘了将树的
ItemsTemplate
设置为DataTemplate我认为最好的选择是不要将对象直接添加到TreeView
属性(因为这将忽略数据模板)并创建一个集合
将这些项添加到并绑定到树视图
,然后您可以删除数据模板
的x:Key
属性,并使用数据类型
,这将把该模板应用到集合中该类型的任何对象上
例如:
<UserControl x:Class="WpfApplication8.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApplication8"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" Name="UI">
<UserControl.Resources>
<DataTemplate DataType="{x:Type local:MyObject}">
<StackPanel Orientation="Horizontal" Height="20" Margin="2,0,2,0">
<!--<Image Width="16" Height="16" Source="{StaticResource FolderImage}" Margin="0,0,5,0" />-->
<TextBlock Text="{Binding SetName}" Foreground="Red"/>
</StackPanel>
</DataTemplate>
</UserControl.Resources>
<Grid DataContext="{Binding ElementName=UI}">
<TreeView x:Name="treeView1" ItemsSource="{Binding TreeItems}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" />
</Grid>
</UserControl>
代码:
公共部分类UserControl1:UserControl
{
公共用户控制1()
{
初始化组件();
//foreach(qss中的var qs)
对于(int i=0;i<50;i++)
{
//添加(qs);
Add(新的MyObject{SetName=“Test1”});
}
}
私有ObservableCollection_treeItems=新ObservableCollection();
公共可观测收集树
{
获取{return\u treeItems;}
设置{u treeItems=value;}
}
}
//你的“qs”对象
公共类MyObject:INotifyPropertyChanged
{
私有字符串_folderImage;
公共字符串文件夹图像
{
获取{return\u folderImage;}
设置{u folderImage=value;NotifyPropertyChanged(“folderImage”);}
}
私有字符串_setname;
公共字符串集名
{
获取{return\u setname;}
set{u setname=value;NotifyPropertyChanged(“setname”);}
}
公共事件属性更改事件处理程序属性更改;
私有void NotifyPropertyChanged(字符串属性)
{
if(PropertyChanged!=null)
{
PropertyChanged(此,新PropertyChangedEventArgs(property));
}
}
}
对不起,我不明白。您能更具体一点吗?如果我将相同的DataTemplate设置到treeView,输出告诉我以下内容:ItemTemplate和ItemTemplateSelector对于已经是ItemsControl容器类型的项被忽略;键入class='TreeViewItem'
您必须这样做,将对象添加到项目
不会使用模板,仅当您使用项目源
时,它们才有效。非常感谢您,我不想使用项目源
,但我想这是使用数据模板的唯一方法
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
// foreach (var qs in qss)
for (int i = 0; i < 50; i++)
{
// TreeItems.Add(qs);
TreeItems.Add(new MyObject { SetName = "Test1" });
}
}
private ObservableCollection<MyObject> _treeItems = new ObservableCollection<MyObject>();
public ObservableCollection<MyObject> TreeItems
{
get { return _treeItems; }
set { _treeItems = value; }
}
}
// Your "qs" object
public class MyObject : INotifyPropertyChanged
{
private string _folderImage;
public string FolderImage
{
get { return _folderImage; }
set { _folderImage = value; NotifyPropertyChanged("FolderImage"); }
}
private string _setname;
public string SetName
{
get { return _setname; }
set { _setname = value; NotifyPropertyChanged("SetName"); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}