Skip to content

Commit e303dc1

Browse files
committed
Adding template selector support
1 parent 74311c6 commit e303dc1

File tree

4 files changed

+139
-3
lines changed

4 files changed

+139
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<UserControl x:Class="MaterialDesignThemes.UITests.WPF.TreeListViews.TreeListViewTemplateSelector"
2+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6+
xmlns:local="clr-namespace:MaterialDesignThemes.UITests.WPF.TreeListViews"
7+
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
8+
xmlns:sys="clr-namespace:System;assembly=mscorlib"
9+
mc:Ignorable="d"
10+
DataContext="{Binding RelativeSource={RelativeSource Self}}"
11+
d:DesignHeight="450" d:DesignWidth="800">
12+
<materialDesign:TreeListView
13+
x:Name="TreeListView"
14+
ItemsSource="{Binding Items}">
15+
<materialDesign:TreeListView.ItemTemplateSelector>
16+
<local:TypeTemplateSelector>
17+
<local:TypeTemplateSelector.NumberTemplate>
18+
<HierarchicalDataTemplate DataType="{x:Type local:TreeItem}"
19+
ItemsSource="{Binding Children}">
20+
<TextBlock Text="{Binding Value}" Foreground="Red" />
21+
</HierarchicalDataTemplate>
22+
</local:TypeTemplateSelector.NumberTemplate>
23+
24+
<local:TypeTemplateSelector.StringTemplate>
25+
<HierarchicalDataTemplate DataType="{x:Type local:TreeItem}"
26+
ItemsSource="{Binding Children}">
27+
<TextBlock Text="{Binding Value}" Foreground="Blue" />
28+
</HierarchicalDataTemplate>
29+
</local:TypeTemplateSelector.StringTemplate>
30+
</local:TypeTemplateSelector>
31+
</materialDesign:TreeListView.ItemTemplateSelector>
32+
</materialDesign:TreeListView>
33+
</UserControl>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System.Collections.ObjectModel;
2+
3+
namespace MaterialDesignThemes.UITests.WPF.TreeListViews;
4+
5+
/// <summary>
6+
/// Interaction logic for TreeListViewTemplateSelector.xaml
7+
/// </summary>
8+
public partial class TreeListViewTemplateSelector
9+
{
10+
public ObservableCollection<TreeItem> Items { get; } = new();
11+
12+
13+
public TreeListViewTemplateSelector()
14+
{
15+
InitializeComponent();
16+
17+
AddChildren("Foo");
18+
AddChildren("42");
19+
AddChildren("24", "a", "b", "c");
20+
AddChildren("Bar", "1", "2", "3");
21+
22+
void AddChildren(string root, params string[] children)
23+
{
24+
TreeItem item = new(root, null);
25+
foreach(string child in children)
26+
{
27+
item.Children.Add(new TreeItem(child, item));
28+
}
29+
Items.Add(item);
30+
}
31+
}
32+
}
33+
34+
public class TypeTemplateSelector : DataTemplateSelector
35+
{
36+
public DataTemplate? NumberTemplate { get; set; }
37+
public DataTemplate? StringTemplate { get; set; }
38+
39+
public override DataTemplate? SelectTemplate(object? item, DependencyObject container)
40+
{
41+
if (item is TreeItem treeItem)
42+
{
43+
if (int.TryParse(treeItem.Value, out _))
44+
{
45+
return NumberTemplate;
46+
}
47+
return StringTemplate;
48+
}
49+
return null;
50+
}
51+
}

MaterialDesignThemes.UITests/WPF/TreeListViews/TreeListViewTests.cs

+49-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
using System.Windows.Media;
2+
13
namespace MaterialDesignThemes.UITests.WPF.TreeListViews;
24

35
public class TreeListViewTests : TestBase
46
{
57
public TreeListViewTests(ITestOutputHelper output)
68
: base(output)
79
{
8-
AttachedDebuggerToRemoteProcess = true;
10+
AttachedDebuggerToRemoteProcess = false;
911
}
1012

1113
[Fact]
@@ -930,6 +932,35 @@ public async Task TopLevelItemWhichHasBeenExpandedAndCollapsed_MovesAndMaintains
930932
recorder.Success();
931933
}
932934

935+
[Fact]
936+
public async Task TreeListView_WithTemplateSelector_UsesSelectorTemplates()
937+
{
938+
await using var recorder = new TestRecorder(App);
939+
940+
IVisualElement<TreeListView> treeListView = (await LoadUserControl<TreeListViewTemplateSelector>()).As<TreeListView>();
941+
942+
IVisualElement<TreeListViewItem> item3 = await treeListView.GetElement<TreeListViewItem>("/TreeListViewItem[2]");
943+
IVisualElement<TreeListViewItem> item4 = await treeListView.GetElement<TreeListViewItem>("/TreeListViewItem[3]");
944+
945+
await item3.LeftClickExpander();
946+
await Task.Delay(500);
947+
await item4.LeftClickExpander();
948+
await Task.Delay(500);
949+
950+
await AssertTreeItemContent(treeListView, 0, "Foo", Colors.Blue);
951+
await AssertTreeItemContent(treeListView, 1, "42", Colors.Red);
952+
await AssertTreeItemContent(treeListView, 2, "24", Colors.Red, true);
953+
await AssertTreeItemContent(treeListView, 3, "a", Colors.Blue);
954+
await AssertTreeItemContent(treeListView, 4, "b", Colors.Blue);
955+
await AssertTreeItemContent(treeListView, 5, "c", Colors.Blue);
956+
await AssertTreeItemContent(treeListView, 6, "Bar", Colors.Blue, true);
957+
await AssertTreeItemContent(treeListView, 7, "1", Colors.Red);
958+
await AssertTreeItemContent(treeListView, 8, "2", Colors.Red);
959+
await AssertTreeItemContent(treeListView, 9, "3", Colors.Red);
960+
961+
recorder.Success();
962+
}
963+
933964
private static async Task AssertTreeItemContent(IVisualElement<TreeListView> treeListView, int index, string content, bool isExpanded = false)
934965
{
935966
await Wait.For(async () =>
@@ -940,6 +971,23 @@ await Wait.For(async () =>
940971
});
941972
}
942973

974+
private static async Task AssertTreeItemContent(
975+
IVisualElement<TreeListView> treeListView,
976+
int index,
977+
string content,
978+
Color foreground,
979+
bool isExpanded = false)
980+
{
981+
await Wait.For(async () =>
982+
{
983+
IVisualElement<TreeListViewItem> treeItem = await treeListView.GetElement<TreeListViewItem>($"/TreeListViewItem[{index}]");
984+
Assert.Equal(content, await treeItem.GetContentText());
985+
Assert.Equal(isExpanded, await treeItem.GetIsExpanded());
986+
IVisualElement<TextBlock> textBlock = await treeItem.GetElement<TextBlock>();
987+
Assert.Equal(foreground, await textBlock.GetForegroundColor());
988+
});
989+
}
990+
943991
private static async Task AddChildren(IVisualElement<TreeListViewItem> item, int numChildren, IVisualElement<Button> addButton)
944992
{
945993
await item.LeftClick();

MaterialDesignThemes.Wpf/TreeListViewItem.cs

+6-2
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,18 @@ private void OnChildrenChanged(NotifyCollectionChangedEventArgs e)
9191

9292
internal void PrepareTreeListViewItem(object? item, TreeListView treeListView, int level, bool isExpanded)
9393
{
94-
//TODO: Handle template selector
95-
if (ContentTemplate is HierarchicalDataTemplate { ItemsSource: { } itemsSourceBinding })
94+
if (GetTemplate() is HierarchicalDataTemplate { ItemsSource: { } itemsSourceBinding })
9695
{
9796
SetBinding(ChildrenProperty, itemsSourceBinding);
9897
}
9998
IsExpanded = isExpanded;
10099
Level = level;
101100
TreeListView = treeListView;
101+
102+
DataTemplate GetTemplate()
103+
{
104+
return ContentTemplate ?? ContentTemplateSelector.SelectTemplate(item, this);
105+
}
102106
}
103107

104108
internal void ClearTreeListViewItem(object item, TreeListView treeListView)

0 commit comments

Comments
 (0)