gpt4 book ai didi

wpf - 当 IsSelected 和 TreeView 中使用的两种类型时更改 TreeViewItem 模板

转载 作者:行者123 更新时间:2023-12-02 08:43:59 26 4
gpt4 key购买 nike

在我的 TreeView 中,我使用两个不同的类进行绑定(bind)。例如,我有一个组,可以有 ChildGroup 并且可以有 Items。该类的示例代码:

using System.Collections.Generic;
using System.Collections.ObjectModel;

namespace WpfApplication1
{
public class Group
{
public Group(string name)
{
Name = name;
items = new ObservableCollection<Item>();
groups = new ObservableCollection<Group>();
}
public string Name { get;
set;
}

private ObservableCollection<Item> items;
private ObservableCollection<Group> groups;

public ObservableCollection<Item> Items
{
get { return items; }
}


public ObservableCollection<Group> Groups
{
get { return groups; }
}

public IEnumerable<object> AllItems
{
get
{
foreach (var group in groups)
{
yield return group;
}
foreach (var item in items)
{
yield return item;
}
}
}

}

public class Item
{
public Item(string name)
{
ItemName = name;
}

public string ItemName
{
get;
set;
}
}
}

为了将其绑定(bind)到 TreeView,我使用以下模板

<Grid>
<TreeView Name="treeView">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type WpfApplication1:Group}"
ItemsSource="{Binding AllItems}">
<TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type WpfApplication1:Item}">
<TextBlock Text="{Binding ItemName}" FontStyle="Italic"/>
</DataTemplate>
</TreeView.Resources>
</TreeView>
</Grid>

这很容易。

问题是我需要在选择时更改 ItemTemplate。我只需要更改选择的 Item 类。

如果只有一个类用于绑定(bind),我就可以做到。使用样式和触发器也很容易,如下所示:

<TreeView Name="treeView1" Grid.Column="1">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type WpfApplication1:Group}"
ItemsSource="{Binding AllItems}"
x:Key="groupTemplate">
<TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type WpfApplication1:Group}"
ItemsSource="{Binding AllItems}"
x:Key="selectedGroupTemplate">
<TextBlock Text="{Binding Name}" FontStyle="Italic" FontWeight="Bold" FontSize="14"/>
</HierarchicalDataTemplate>
</TreeView.Resources>

<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="HeaderTemplate" Value="{StaticResource groupTemplate}"/>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="HeaderTemplate" Value="{StaticResource selectedGroupTemplate}"/>
</Trigger>
</Style.Triggers>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>

但是我在多类绑定(bind)方面遇到了麻烦。

如何更改 SelectedItem 模板,然后使用多类绑定(bind)?有什么想法吗?

我的示例代码:

using System.Collections.ObjectModel;
using System.Windows;

namespace WpfApplication1
{
/// <summary>
/// Interaction logic for Window2.xaml
/// </summary>
public partial class Window2 : Window
{
private ObservableCollection<Group> _groups;
public ObservableCollection<Group> Groups
{
get { return _groups; }
}

public Window2()
{
InitializeComponent();

InitGroups();

treeView.ItemsSource = _groups;
treeView1.ItemsSource = _groups;
}

private void InitGroups()
{
_groups = new ObservableCollection<Group>();

Group group1 = new Group("Group1");
group1.Groups.Add(new Group("Group1.1"));
group1.Groups.Add(new Group("Group1.2"));
group1.Groups.Add(new Group("Group1.3"));

group1.Items.Add(new Item("Item1.1"));
group1.Items.Add(new Item("Item1.2"));

group1.Groups[1].Items.Add(new Item("Item1.2.1"));
group1.Groups[1].Items.Add(new Item("Item1.2.2"));


_groups.Add(group1);

Group group2 = new Group("Group2");
group2.Groups.Add(new Group("Group2.1"));
group2.Groups.Add(new Group("Group2.2"));

group2.Items.Add(new Item("Item2.1"));
group2.Groups[0].Items.Add(new Item("Item2.1.1"));
group2.Groups[0].Items.Add(new Item("Item2.1.1"));

_groups.Add(group2);
}
}
}

结果 Result

现在我想使用TreeView.HeaderTemplateSelector,但可能存在仅使用xaml的方法。

谢谢。

最佳答案

有多种方法可以实现您想要的结果。如果您确定您的 DataTemplate 将仅在 TreeViewItem 对象中使用,那么最简单的方法就是直接绑定(bind)到 TreeViewItem.IsSelected 属性然后对 DataTemplate 中的更改使用react:

    <DataTemplate DataType="{x:Type WpfApplication1:Item}">
<TextBlock Text="{Binding ItemName}">
<TextBlock.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected, RelativeSource=
{RelativeSource FindAncestor, AncestorType={x:Type TreeViewItem}}, FallbackValue=False}"
Value="True">
<Setter Property="TextBlock.FontStyle" Value="Italic" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>

关于wpf - 当 IsSelected 和 TreeView 中使用的两种类型时更改 TreeViewItem 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9123608/

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