Skip to content

Commit 2cb2f69

Browse files
MohammadHadi AttariehMohammadHadi2031
authored andcommitted
Implement GridView support for having columns
1 parent 122a534 commit 2cb2f69

File tree

4 files changed

+101
-33
lines changed

4 files changed

+101
-33
lines changed

src/MainDemo.Wpf/Trees.xaml

Lines changed: 57 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
77
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
88
xmlns:smtx="clr-namespace:ShowMeTheXAML;assembly=ShowMeTheXAML"
9+
xmlns:converters="clr-namespace:MaterialDesignThemes.Wpf.Converters;assembly=MaterialDesignThemes.Wpf"
910
d:DataContext="{d:DesignInstance domain:TreesViewModel}"
1011
d:DesignHeight="1080"
1112
d:DesignWidth="1920"
@@ -18,6 +19,8 @@
1819
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.PopupBox.xaml" />
1920
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.TextBlock.xaml" />
2021
</ResourceDictionary.MergedDictionaries>
22+
23+
<converters:TreeListViewIndentConverter x:Key="TreeListViewIndentConverter" />
2124
</ResourceDictionary>
2225
</UserControl.Resources>
2326

@@ -214,9 +217,19 @@
214217
ItemsSource="{Binding TreeItems}"
215218
SelectedItem="{Binding SelectedTreeItem}">
216219
<materialDesign:TreeListView.Resources>
217-
<HierarchicalDataTemplate DataType="{x:Type domain:TestItem}"
218-
ItemsSource="{Binding Items, Mode=OneTime}">
219-
<TextBlock Margin="3,2" Text="{Binding Name, Mode=OneTime}" />
220+
<HierarchicalDataTemplate DataType="{x:Type domain:TestItem}" ItemsSource="{Binding Items, Mode=OneTime}">
221+
<StackPanel Orientation="Horizontal">
222+
<StackPanel.Margin>
223+
<MultiBinding Converter="{StaticResource TreeListViewIndentConverter}">
224+
<Binding Path="LevelIndentSize" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type materialDesign:TreeListView}}" />
225+
<Binding Path="Level" RelativeSource="{RelativeSource AncestorType={x:Type materialDesign:TreeListViewItem}}" />
226+
</MultiBinding>
227+
</StackPanel.Margin>
228+
229+
<ToggleButton IsChecked="{Binding RelativeSource={RelativeSource AncestorType=materialDesign:TreeListViewItem, Mode=FindAncestor}, Path=IsExpanded}" Style="{StaticResource MaterialDesignTreeListViewToggleButtonStyle}" />
230+
231+
<TextBlock VerticalAlignment="Center" Text="{Binding Name, Mode=OneTime}" />
232+
</StackPanel>
220233
</HierarchicalDataTemplate>
221234

222235
<HierarchicalDataTemplate DataType="{x:Type domain:MovieCategory}"
@@ -231,19 +244,52 @@
231244
</DataTemplate>
232245
</materialDesign:TreeListView.Resources>
233246

234-
<!--
235-
Because Data Virtualization is enabled on this tree view by default, if you don't bind the IsExpanded property to something in the bound view model,
236-
you can loose the expanded state of items when the TreeListViewItem is recycled.
237-
238-
For more information:
239-
https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit/issues/3640#issuecomment-2274086113
240-
https://learn.microsoft.com/dotnet/desktop/wpf/advanced/optimizing-performance-controls?view=netframeworkdesktop-4.8&WT.mc_id=DT-MVP-5003472
241-
-->
247+
<!--
248+
Because Data Virtualization is enabled on this tree view by default, if you don't bind the IsExpanded property to something in the bound view model,
249+
you can loose the expanded state of items when the TreeListViewItem is recycled.
250+
251+
For more information:
252+
https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit/issues/3640#issuecomment-2274086113
253+
https://learn.microsoft.com/dotnet/desktop/wpf/advanced/optimizing-performance-controls?view=netframeworkdesktop-4.8&WT.mc_id=DT-MVP-5003472
254+
-->
242255
<materialDesign:TreeListView.ItemContainerStyle>
243256
<Style TargetType="materialDesign:TreeListViewItem" BasedOn="{StaticResource {x:Type materialDesign:TreeListViewItem}}">
244257
<Setter Property="IsExpanded" Value="{Binding IsExpanded}" />
245258
</Style>
246259
</materialDesign:TreeListView.ItemContainerStyle>
260+
261+
<materialDesign:TreeListView.View>
262+
<GridView>
263+
<GridView.Columns>
264+
<GridViewColumn Width="250" Header="Name">
265+
<GridViewColumn.CellTemplate>
266+
<DataTemplate>
267+
<StackPanel Orientation="Horizontal">
268+
<StackPanel.Margin>
269+
<MultiBinding Converter="{StaticResource TreeListViewIndentConverter}">
270+
<Binding Path="LevelIndentSize" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type materialDesign:TreeListView}}" />
271+
<Binding Path="Level" RelativeSource="{RelativeSource AncestorType={x:Type materialDesign:TreeListViewItem}}" />
272+
</MultiBinding>
273+
</StackPanel.Margin>
274+
275+
<ToggleButton IsChecked="{Binding RelativeSource={RelativeSource AncestorType=materialDesign:TreeListViewItem, Mode=FindAncestor}, Path=IsExpanded}" Style="{StaticResource MaterialDesignTreeListViewToggleButtonStyle}" />
276+
277+
<TextBlock VerticalAlignment="Center" Text="{Binding Name, Mode=OneTime}" />
278+
</StackPanel>
279+
</DataTemplate>
280+
</GridViewColumn.CellTemplate>
281+
</GridViewColumn>
282+
283+
<GridViewColumn Width="100" Header="Count">
284+
<GridViewColumn.CellTemplate>
285+
<DataTemplate>
286+
<TextBlock VerticalAlignment="Center" Text="{Binding Items.Count, Mode=OneWay}" />
287+
</DataTemplate>
288+
</GridViewColumn.CellTemplate>
289+
</GridViewColumn>
290+
</GridView.Columns>
291+
</GridView>
292+
</materialDesign:TreeListView.View>
247293
</materialDesign:TreeListView>
248294
<StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" HorizontalAlignment="Right">
249295
<Button Command="{Binding AddListTreeItemCommand}"
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System.Globalization;
2+
using System.Windows.Data;
3+
4+
namespace MaterialDesignThemes.Wpf.Converters;
5+
6+
internal class ViewIsGridViewConverter : IValueConverter
7+
{
8+
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
9+
{
10+
// Returns true if value is a GridView, otherwise false
11+
return value is GridView;
12+
}
13+
14+
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
15+
{
16+
throw new NotSupportedException();
17+
}
18+
}

src/MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.TreeListView.xaml

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
22
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
33
xmlns:converters="clr-namespace:MaterialDesignThemes.Wpf.Converters"
4-
xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf"
5-
xmlns:internal="clr-namespace:MaterialDesignThemes.Wpf.Internal">
4+
xmlns:internal="clr-namespace:MaterialDesignThemes.Wpf.Internal"
5+
xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf">
6+
<converters:ViewIsGridViewConverter x:Key="ViewIsGridViewConverter" />
67

78
<Style x:Key="MaterialDesignTreeListViewToggleButtonStyle" TargetType="{x:Type ToggleButton}">
89
<Setter Property="Background" Value="Transparent" />
@@ -78,6 +79,11 @@
7879
</Canvas>
7980
</Viewbox>
8081
</Border>
82+
<ControlTemplate.Triggers>
83+
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type wpf:TreeListViewItem}}, Path=HasItems}" Value="false">
84+
<Setter Property="Visibility" Value="Hidden" />
85+
</DataTrigger>
86+
</ControlTemplate.Triggers>
8187
</ControlTemplate>
8288
</Setter.Value>
8389
</Setter>
@@ -105,12 +111,6 @@
105111
<Setter.Value>
106112
<ControlTemplate TargetType="{x:Type wpf:TreeListViewItem}">
107113
<Grid>
108-
<Grid.Margin>
109-
<MultiBinding Converter="{x:Static converters:TreeListViewIndentConverter.Instance}">
110-
<Binding Path="LevelIndentSize" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type wpf:TreeListView}}" FallbackValue="16" />
111-
<Binding Path="Level" RelativeSource="{RelativeSource TemplatedParent}" />
112-
</MultiBinding>
113-
</Grid.Margin>
114114
<Grid.ColumnDefinitions>
115115
<ColumnDefinition Width="Auto" />
116116
<ColumnDefinition Width="Auto" />
@@ -164,15 +164,6 @@
164164
<VisualState x:Name="Collapsed" />
165165
</VisualStateGroup>
166166
</VisualStateManager.VisualStateGroups>
167-
<ToggleButton x:Name="Expander"
168-
Width="{TemplateBinding wpf:TreeViewAssist.ExpanderSize}"
169-
Height="{TemplateBinding wpf:TreeViewAssist.ExpanderSize}"
170-
Margin="8,0,8,0"
171-
VerticalAlignment="Center"
172-
ClickMode="Press"
173-
Foreground="{TemplateBinding Foreground}"
174-
IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"
175-
Style="{StaticResource MaterialDesignTreeListViewToggleButtonStyle}" />
176167

177168
<Border x:Name="MouseOverBorder"
178169
Grid.Column="1"
@@ -198,8 +189,19 @@
198189
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
199190
Feedback="{TemplateBinding Foreground, Converter={x:Static converters:BrushRoundConverter.Instance}}"
200191
Focusable="False"
192+
Foreground="{TemplateBinding Foreground}"
201193
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}">
202-
<internal:TreeListViewContentPresenter x:Name="PART_ContentPresenter" ContentSource="Content" />
194+
<Grid Margin="0,0,0,0">
195+
<internal:TreeListViewContentPresenter x:Name="PART_ContentPresenter"
196+
ContentSource="Content"
197+
Visibility="Visible" />
198+
199+
<GridViewRowPresenter x:Name="PART_GridViewRowPresenterr"
200+
Margin="{TemplateBinding Padding}"
201+
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
202+
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
203+
Visibility="Collapsed" />
204+
</Grid>
203205
</wpf:Ripple>
204206
</Grid>
205207

@@ -219,9 +221,6 @@
219221
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(wpf:TreeViewAssist.AdditionalTemplateSelector), Converter={x:Static converters:NullableToVisibilityConverter.CollapsedInstance}, Mode=OneWay}" Value="Visible">
220222
<Setter TargetName="AdditionalContentControl" Property="Visibility" Value="Visible" />
221223
</DataTrigger>
222-
<Trigger Property="HasItems" Value="false">
223-
<Setter TargetName="Expander" Property="Visibility" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(wpf:TreeViewAssist.HasNoItemsExpanderVisibility)}" />
224-
</Trigger>
225224
<Trigger Property="IsEnabled" Value="false">
226225
<Setter Property="Opacity" Value=".56" />
227226
</Trigger>
@@ -230,6 +229,10 @@
230229
<Setter TargetName="Ripple" Property="Feedback" Value="Transparent" />
231230
<Setter TargetName="SelectedBorder" Property="Visibility" Value="Collapsed" />
232231
</DataTrigger>
232+
<DataTrigger Binding="{Binding View, RelativeSource={RelativeSource Self}, Converter={StaticResource ViewIsGridViewConverter}}" Value="True">
233+
<Setter TargetName="PART_ContentPresenter" Property="Visibility" Value="Hidden" />
234+
<Setter TargetName="PART_GridViewRowPresenterr" Property="Visibility" Value="Visible" />
235+
</DataTrigger>
233236
</ControlTemplate.Triggers>
234237
</ControlTemplate>
235238
</Setter.Value>
@@ -245,6 +248,7 @@
245248
<Setter Property="BorderBrush" Value="{x:Null}" />
246249
<Setter Property="BorderThickness" Value="0" />
247250
<Setter Property="Foreground" Value="{DynamicResource MaterialDesign.Brush.Foreground}" />
251+
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
248252
<Setter Property="Padding" Value="1" />
249253
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
250254
<Setter Property="ScrollViewer.PanningMode" Value="Both" />
@@ -257,6 +261,7 @@
257261
BorderThickness="{TemplateBinding BorderThickness}"
258262
SnapsToDevicePixels="true">
259263
<ScrollViewer x:Name="PART_ScrollViewer"
264+
Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}"
260265
wpf:ScrollViewerAssist.IgnorePadding="{Binding Path=(wpf:ScrollViewerAssist.IgnorePadding), RelativeSource={RelativeSource TemplatedParent}}"
261266
wpf:ScrollViewerAssist.PaddingMode="{Binding Path=(wpf:ScrollViewerAssist.PaddingMode), RelativeSource={RelativeSource TemplatedParent}}"
262267
Padding="{TemplateBinding Padding}"

src/MaterialDesignThemes.Wpf/TreeListView.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
namespace MaterialDesignThemes.Wpf;
77

88
//TODO: Implement bindable property for getting selected items
9-
//TODO: Implement GridView support for having columns
109
public class TreeListView : ListView
1110
{
1211
public double LevelIndentSize

0 commit comments

Comments
 (0)