Skip to content

Commit f72c231

Browse files
committed
use a converter so we can seamlessly switch between ListView with GridView applied (or not)
1 parent ef9c19d commit f72c231

File tree

4 files changed

+89
-45
lines changed

4 files changed

+89
-45
lines changed

MaterialDesignThemes.Wpf/Converters/GridViewItemContainerStyleConverter.cs

Lines changed: 0 additions & 13 deletions
This file was deleted.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using System;
2+
using System.Globalization;
3+
using System.Windows;
4+
using System.Windows.Controls;
5+
using System.Windows.Data;
6+
7+
namespace MaterialDesignThemes.Wpf.Converters
8+
{
9+
/// <summary>
10+
/// Helps coerce the correct item container style for a <see cref="ListView"/>, according to whether the list is displaying in standard mode, or using a <see cref="ListView.View"/>, such as a <see cref="GridView"/>.
11+
/// </summary>
12+
public class ListViewItemContainerStyleConverter : IValueConverter
13+
{
14+
/// <summary>
15+
/// Item container style to use when <see cref="ListView.View"/> is <c>null</c>.
16+
/// </summary>
17+
public Style DefaultItemContainerStyle { get; set; }
18+
19+
/// <summary>
20+
/// Item container style to use when <see cref="ListView.View"/> is not <c>null</c>, typically when a <see cref="GridView"/> is applied.
21+
/// </summary>
22+
public Style ViewItemContainerStyle { get; set; }
23+
24+
/// <summary>
25+
/// Returns the item container <see cref="Style"/> to use for a <see cref="ListView"/>.
26+
/// </summary>
27+
/// <param name="value">Should be a <see cref="ListView"/> or <see cref="ViewBase"/> instance.</param>
28+
/// <param name="targetType"></param>
29+
/// <param name="parameter"></param>
30+
/// <param name="culture"></param>
31+
/// <returns></returns>
32+
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
33+
{
34+
var listView = value as ListView;
35+
if (listView != null)
36+
{
37+
return listView.View != null ? ViewItemContainerStyle : DefaultItemContainerStyle;
38+
}
39+
40+
return value is ViewBase ? ViewItemContainerStyle : DefaultItemContainerStyle;
41+
}
42+
43+
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
44+
{
45+
return Binding.DoNothing;
46+
}
47+
}
48+
}

MaterialDesignThemes.Wpf/MaterialDesignThemes.Wpf.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@
279279
<Compile Include="Converters\CircularProgressBar\StartPointConverter.cs" />
280280
<Compile Include="Converters\ClockItemIsCheckedConverter.cs" />
281281
<Compile Include="Converters\ClockLineConverter.cs" />
282+
<Compile Include="Converters\ListViewItemContainerStyleConverter.cs" />
282283
<Compile Include="Converters\RangePositionConverterConverter.cs" />
283284
<Compile Include="Converters\DrawerOffsetConverter.cs" />
284285
<Compile Include="Converters\EqualityToVisibilityConverter.cs" />

MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.ListView.xaml

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
22
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3-
xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf">
3+
xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf"
4+
xmlns:converters="clr-namespace:MaterialDesignThemes.Wpf.Converters">
45

56
<ResourceDictionary.MergedDictionaries>
7+
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.ListBox.xaml" />
68
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.TextBox.xaml" />
79
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Thumb.xaml" />
810
</ResourceDictionary.MergedDictionaries>
@@ -129,37 +131,6 @@
129131
</Style.Triggers>
130132
</Style>
131133

132-
<Style x:Key="MaterialDesignListView" TargetType="{x:Type ListView}">
133-
<Setter Property="Background" Value="{DynamicResource MaterialDesignPaper}" />
134-
<Setter Property="Foreground" Value="{DynamicResource MaterialDesignBody}" />
135-
<Setter Property="BorderBrush" Value="{DynamicResource MaterialDesignTextBoxBorder}" />
136-
<Setter Property="BorderThickness" Value="0" />
137-
<Setter Property="FontSize" Value="13" />
138-
<Setter Property="ScrollViewer.CanContentScroll" Value="True" />
139-
<Setter Property="ScrollViewer.PanningMode" Value="Both" />
140-
<Setter Property="Stylus.IsFlicksEnabled" Value="False" />
141-
<Setter Property="SnapsToDevicePixels" Value="True" />
142-
<Setter Property="OverridesDefaultStyle" Value="False" />
143-
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
144-
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
145-
<Setter Property="ScrollViewer.CanContentScroll" Value="True" />
146-
<Setter Property="VerticalContentAlignment" Value="Center" />
147-
<Setter Property="Template">
148-
<Setter.Value>
149-
<ControlTemplate TargetType="{x:Type ListView}">
150-
<ScrollViewer Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}">
151-
<ItemsPresenter />
152-
</ScrollViewer>
153-
<ControlTemplate.Triggers>
154-
<Trigger Property="IsGrouping" Value="True">
155-
<Setter Property="ScrollViewer.CanContentScroll" Value="false" />
156-
</Trigger>
157-
</ControlTemplate.Triggers>
158-
</ControlTemplate>
159-
</Setter.Value>
160-
</Setter>
161-
</Style>
162-
163134
<Style x:Key="MaterialDesignGridViewItem" TargetType="ListViewItem">
164135
<Setter Property="SnapsToDevicePixels" Value="True" />
165136
<Setter Property="OverridesDefaultStyle" Value="True" />
@@ -212,4 +183,41 @@
212183
</Style.Triggers>
213184
</Style>
214185

186+
<converters:ListViewItemContainerStyleConverter
187+
x:Key="ListViewItemContainerStyleConverter"
188+
DefaultItemContainerStyle="{StaticResource MaterialDesignListBoxItem}"
189+
ViewItemContainerStyle="{StaticResource MaterialDesignGridViewItem}" />
190+
191+
<Style x:Key="MaterialDesignListView" TargetType="{x:Type ListView}">
192+
<Setter Property="Background" Value="{DynamicResource MaterialDesignPaper}" />
193+
<Setter Property="Foreground" Value="{DynamicResource MaterialDesignBody}" />
194+
<Setter Property="BorderBrush" Value="{DynamicResource MaterialDesignTextBoxBorder}" />
195+
<Setter Property="BorderThickness" Value="0" />
196+
<Setter Property="FontSize" Value="13" />
197+
<Setter Property="ItemContainerStyle" Value="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource ListViewItemContainerStyleConverter}}" />
198+
<Setter Property="ScrollViewer.CanContentScroll" Value="True" />
199+
<Setter Property="ScrollViewer.PanningMode" Value="Both" />
200+
<Setter Property="Stylus.IsFlicksEnabled" Value="False" />
201+
<Setter Property="SnapsToDevicePixels" Value="True" />
202+
<Setter Property="OverridesDefaultStyle" Value="False" />
203+
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
204+
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
205+
<Setter Property="ScrollViewer.CanContentScroll" Value="True" />
206+
<Setter Property="VerticalContentAlignment" Value="Center" />
207+
<Setter Property="Template">
208+
<Setter.Value>
209+
<ControlTemplate TargetType="{x:Type ListView}">
210+
<ScrollViewer Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}">
211+
<ItemsPresenter />
212+
</ScrollViewer>
213+
<ControlTemplate.Triggers>
214+
<Trigger Property="IsGrouping" Value="True">
215+
<Setter Property="ScrollViewer.CanContentScroll" Value="false" />
216+
</Trigger>
217+
</ControlTemplate.Triggers>
218+
</ControlTemplate>
219+
</Setter.Value>
220+
</Setter>
221+
</Style>
222+
215223
</ResourceDictionary>

0 commit comments

Comments
 (0)