WPF TreeView HierarchicalDataTemplate 根据 ItemsSource 对象将子项设置为活动 属性

WPF TreeView HierarchicalDataTemplate set child to active based on ItemsSource object property

我正在使用 C# WPF 开发一个 IRC 客户端,它有一个 TreeView 以这种格式显示客户端当前连接到的服务器和频道:

这是我当前的代码:

<HierarchicalDataTemplate DataType="{x:Type IRCLib:ServerConnection}"
                          ItemsSource="{Binding Path=ActiveChannels}">
    <TreeViewItem Header="{Binding Path=Config.ServerName}" Foreground="Black"/>
</HierarchicalDataTemplate>

我现在想做的是,如果从 ActiveChannels 加载的 Channel 对象的 IsActive 属性 设置为 true,则将该对象的 TreeViewItem IsSelected 属性 设置为 true。

几个小时以来,我一直在寻找答案,但我一直找不到任何可以帮助我实现这一目标的东西,但如果这个问题已经在这里得到解答,我相信你们中的一些人能够为我指明正确的方向。

只需将 TreeViewItem 的 IsSelected 属性 绑定设置为 Channel 对象的 IsActive 属性。 (确保 dataContexts 正确)

试试这个模板,而不是你现在拥有的模板:

<HierarchicalDataTemplate DataType="{x:Type IRCLib:ServerConnection}"
                      ItemsSource="{Binding Path=ActiveChannels}">
        <CheckBox IsChecked="{Binding IsActive}" Content="{Binding Path=Config.ServerName}" Foreground="Black"/>
    </HierarchicalDataTemplate>

您将看到根据 IsActive 属性

检查所有项目

所以我尝试了更多的东西,终于找到了我要找的东西,这出奇地简单。

<TreeView.Resources>

    <HierarchicalDataTemplate DataType="{x:Type IRCLib:ServerConnection}"
                              ItemsSource="{Binding Path=ActiveChannels}">
          <TreeViewItem Header="{Binding Path=Config.ServerName}"
                        Foreground="Black"
                        IsExpanded="True"/>
    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate DataType="{x:Type IRCLib:Channel}">
          <TreeViewItem Header="{Binding Path=Name}"
                        IsSelected="{Binding Path=IsActive}"/>
    </HierarchicalDataTemplate>

</TreeView.Resources>

通过使用另一个针对从 Channel 对象创建的 TreeViewItems 的 HierarchicalDataTemplate,我能够正确设置 IsSelected 属性。