gpt4 book ai didi

WPF/XAML TreeView 在绑定(bind)后不突出显示节点

转载 作者:行者123 更新时间:2023-12-01 23:26:07 25 4
gpt4 key购买 nike

所以我遇到了 TreeView 的问题。如果我静态地构建一个 TreeView ,树中的每个节点都是可选的,因为当我点击它时,它会以蓝色突出显示,表明该节点已被选中。

<TreeView 
Grid.Column="0"
Grid.Row="2"
MinHeight="100"
MinWidth="100"
BorderBrush="White"
DataContext="{Binding Projects, Source={x:Static SizingApp:Manager.Instance}}">
<TreeViewItem Header="Project 1" IsExpanded="True">
<TreeViewItem Header="Step 1" IsExpanded="True">
<TreeViewItem Header="Load 1" IsExpanded="True"></TreeViewItem>
<TreeViewItem Header="Load 2" IsExpanded="True"></TreeViewItem>
</TreeViewItem>
<TreeViewItem Header="Step 2" IsExpanded="True">
<TreeViewItem Header="Load 1" IsExpanded="True"></TreeViewItem>
<TreeViewItem Header="Load 2" IsExpanded="True"></TreeViewItem>
</TreeViewItem>
</TreeViewItem>

但是,我绑定(bind)到 TreeView 以填充它。此外,我绑定(bind)到实现 Emiel Jongerius's BindableObjectBase3 class 的对象.这是一个很棒的基类实现,它允许我的对象可绑定(bind)并实现 INotifyPropertyChanged 接口(interface),并关注手动 DependencyProperty 管理。

所以这是我试图在 TreeView 中实现的基本类结构(从我的实际对象中简化而来)。

    public abstract class MyCustomClass : BindableObjectBase3
{
private string m_strName;

public virtual string Name
{
get
{
using (this.GetPropertyTracker(() => this.Name))
{
return m_strName;
}
}
set
{
this.SetValue(ref this.m_strName, value, () => this.Name);
}
}
}

public class Project : MyCustomClass
{
private List<Step> m_steps;

public List<Step> Steps
{
get
{
using (this.GetPropertyTracker(() => this.Steps))
{
return m_steps;
}
}
set
{
this.SetValue(ref this.m_steps, value, () => this.Steps);
}
}
}

public class Step : MyCustomClass
{
private List<Load> m_loads;

public List<Load> Loads
{
get
{
using (this.GetPropertyTracker(() => this.Loads))
{
return m_loads;
}
}
set
{
this.SetValue(ref this.m_loads, value, () => this.Steps);
}
}
}

public class Load : MyCustomClass
{
}

这是我用来实现 TreeView 的基本 XAML:

<TreeView 
Grid.Column="0"
Grid.Row="2"
MinHeight="100"
MinWidth="100"
BorderBrush="White"
DataContext="{Binding Projects, Source={x:Static SizingApp:Manager.Instance}}">
<TreeView.Resources>
<HierarchicalDataTemplate x:Key="LoadTemplate">
<TreeViewItem Header="{Binding Path=Name}">
</TreeViewItem>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="StepTemplate">
<TreeViewItem Header="{Binding Path=Name}" IsExpanded="True"
ItemsSource="{Binding Path=Loads}"
ItemTemplate="{StaticResource LoadTemplate}">
</TreeViewItem>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="ProjectTemplate">
<TreeViewItem Header="{Binding Path=Name}" IsExpanded="True"
ItemsSource="{Binding Path=Steps}"
ItemTemplate="{StaticResource StepTemplate}">
</TreeViewItem>
</HierarchicalDataTemplate>
</TreeView.Resources>
<TreeViewItem
Header="{Resx ResxName=PSSPECApplication.Controls.ProjectControlResources, Key=projectTree_Header}"
ItemsSource="{Binding}"
IsExpanded="True"
Focusable="True"
ItemTemplate="{StaticResource ProjectTemplate}">
</TreeViewItem>
</TreeView>

现在,就绑定(bind)而言,所有这些都可以正常工作。我可以绑定(bind)到一个 ObservableCollection 并且当我添加/删除/操作项目时,TreeView 会相应地更新。

但是,TreeView 中唯一似乎可选择的节点是第一个节点(静态节点)。通过动态绑定(bind)创建的所有其他节点并不表示它们在 GUI 上被选中。我希望它们在单击时也会突出显示蓝色。但他们什么都不做。有谁知道为什么?

最佳答案

您不应在 ItemTemplates 中明确定义 TreeViewItems。您不能选择任何项目的原因是它们没有父 TreeView 来控制选择行为。您需要让 TreeView 为您生成 TreeViewItem 控件,并且只使用项目模板来定义标题的 UI 及其项目的绑定(bind)。改用这样的东西:

<Window.Resources>
<HierarchicalDataTemplate x:Key="LoadTemplate">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="StepTemplate" ItemsSource="{Binding Loads}" ItemTemplate="{StaticResource LoadTemplate}">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="ProjectTemplate" ItemsSource="{Binding Steps}" ItemTemplate="{StaticResource StepTemplate}">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
</Window.Resources>

<TreeView MinHeight="100" MinWidth="100" BorderBrush="White"
ItemsSource="{Binding Path=Projects}"
ItemTemplate="{StaticResource ProjectTemplate}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="True" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>

关于WPF/XAML TreeView 在绑定(bind)后不突出显示节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3557787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com