通过 属性 设置 Treeview HierarchicalDataTemplate
set Treeview HierarchicalDataTemplate via a property
这个有点复杂。我正在尝试创建一个具有树视图和一些其他控件的用户控件,以创建一个对其他实现有用的可重用控件。
我遇到的问题是我不知道如何将在控件外部定义的 HierarchicalDataTemplate 插入到控件内部的树视图中。
这里是我的WPF控件之外
<Grid>
<Grid.Resources>
<HierarchicalDataTemplate x:Key="HierarchicalDataTemplate" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
</Grid.Resources>
<masterTreeUserControl:MasterTreeUserControl
HierarchicalDataTemplate="{StaticResource HierarchicalDataTemplate}"
ItemsSource="{Binding Path=SelectiveListViewModel.Items, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding Path=SelectiveListViewModel.SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
EnableAdd="False"
ItemType="{x:Type viewmodels:LocationItem}"
/>
</Grid>
MasterTreeUserControl 有一个 HierarchicalDataTemplate DependencyProperty
HierarchicalDataTemplateProperty = DependencyProperty.Register("HierarchicalDataTemplate",typeof(HierarchicalDataTemplate),typeof(MasterTreeUserControl));
private static readonly DependencyProperty HierarchicalDataTemplateProperty;
public HierarchicalDataTemplate HierarchicalDataTemplate
{
get
{
return (HierarchicalDataTemplate)GetValue(HierarchicalDataTemplateProperty);
}
set
{
SetValue(HierarchicalDataTemplateProperty, value);
}
}
到目前为止,控件内的 Treeview 如下所示。
<TreeView Name="ItemListView"
Grid.Row="2"
Margin="0,5,0,0"
ItemsSource="{Binding Source={StaticResource ItemsCvs}}">
在树视图的其他实现中,我通常会以类似于此的方式使用 HierarchicalDataTemplate。
<TreeView.Resources>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<TextBlock Text="Hello"/>
</HierarchicalDataTemplate>
</TreeView.Resources>
但是,由于 HierarchicalDataTemplate 位于依赖关系中 属性,我需要以某种方式将其绑定到 Treeview 中。我已经浏览了互联网(并将继续这样做)但找不到任何相关内容。
如何将包含 HierarchicalDataTemplate 的依赖项 属性 注入到树视图中?
以下应该有效:
- 将
PropertyChangedCallback
添加到您的 HierarchicalDataTemplateProperty
。
在handler中,添加模板控制资源:
private static void OnTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var This = d as MasterTreeUserControl;
var template = e.NewValue as HierarchicalDataTemplate;
if(template != null)
{
This.ItemListView.Resources[new DataTemplateKey(template.DataType)] = template;
}
}
唯一的问题是您的 HierarchicalDataTemplate
必须将 DataType
设置为模板类型。您应该以某种方式强制执行(验证等)
这个有点复杂。我正在尝试创建一个具有树视图和一些其他控件的用户控件,以创建一个对其他实现有用的可重用控件。
我遇到的问题是我不知道如何将在控件外部定义的 HierarchicalDataTemplate 插入到控件内部的树视图中。
这里是我的WPF控件之外
<Grid>
<Grid.Resources>
<HierarchicalDataTemplate x:Key="HierarchicalDataTemplate" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
</Grid.Resources>
<masterTreeUserControl:MasterTreeUserControl
HierarchicalDataTemplate="{StaticResource HierarchicalDataTemplate}"
ItemsSource="{Binding Path=SelectiveListViewModel.Items, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding Path=SelectiveListViewModel.SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
EnableAdd="False"
ItemType="{x:Type viewmodels:LocationItem}"
/>
</Grid>
MasterTreeUserControl 有一个 HierarchicalDataTemplate DependencyProperty
HierarchicalDataTemplateProperty = DependencyProperty.Register("HierarchicalDataTemplate",typeof(HierarchicalDataTemplate),typeof(MasterTreeUserControl));
private static readonly DependencyProperty HierarchicalDataTemplateProperty;
public HierarchicalDataTemplate HierarchicalDataTemplate
{
get
{
return (HierarchicalDataTemplate)GetValue(HierarchicalDataTemplateProperty);
}
set
{
SetValue(HierarchicalDataTemplateProperty, value);
}
}
到目前为止,控件内的 Treeview 如下所示。
<TreeView Name="ItemListView"
Grid.Row="2"
Margin="0,5,0,0"
ItemsSource="{Binding Source={StaticResource ItemsCvs}}">
在树视图的其他实现中,我通常会以类似于此的方式使用 HierarchicalDataTemplate。
<TreeView.Resources>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<TextBlock Text="Hello"/>
</HierarchicalDataTemplate>
</TreeView.Resources>
但是,由于 HierarchicalDataTemplate 位于依赖关系中 属性,我需要以某种方式将其绑定到 Treeview 中。我已经浏览了互联网(并将继续这样做)但找不到任何相关内容。
如何将包含 HierarchicalDataTemplate 的依赖项 属性 注入到树视图中?
以下应该有效:
- 将
PropertyChangedCallback
添加到您的HierarchicalDataTemplateProperty
。 在handler中,添加模板控制资源:
private static void OnTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var This = d as MasterTreeUserControl; var template = e.NewValue as HierarchicalDataTemplate; if(template != null) { This.ItemListView.Resources[new DataTemplateKey(template.DataType)] = template; } }
唯一的问题是您的 HierarchicalDataTemplate
必须将 DataType
设置为模板类型。您应该以某种方式强制执行(验证等)