Skip to content

Commit 0a2c6da

Browse files
committed
Added UsePopup property in ValidationAssist
UsePopup property allows to use popup in validationerrortemplate
1 parent 0e1c031 commit 0a2c6da

File tree

4 files changed

+123
-16
lines changed

4 files changed

+123
-16
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Globalization;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
using System.Windows;
8+
using System.Windows.Data;
9+
10+
namespace MaterialDesignThemes.Wpf.Converters
11+
{
12+
public class BooleanToVisibilityConverter : IValueConverter
13+
{
14+
public Visibility TrueValue { get; set; }
15+
public Visibility FalseValue { get; set; }
16+
17+
public object Convert(object value, Type targetType,
18+
object parameter, CultureInfo culture)
19+
{
20+
if (value is Boolean)
21+
return (Boolean)value ? TrueValue : FalseValue;
22+
23+
if (parameter is Boolean)
24+
return (Boolean)parameter ? TrueValue : FalseValue;
25+
26+
return null;
27+
}
28+
29+
public object ConvertBack(object value, Type targetType,
30+
object parameter, CultureInfo culture)
31+
{
32+
if (Equals(value, TrueValue))
33+
return true;
34+
35+
if (Equals(value, FalseValue))
36+
return false;
37+
38+
if (Equals(parameter, TrueValue))
39+
return true;
40+
41+
if (Equals(parameter, FalseValue))
42+
return false;
43+
44+
return null;
45+
}
46+
}
47+
}

MaterialDesignThemes.Wpf/MaterialDesignThemes.Wpf.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@
199199
<Compile Include="ClockChoiceMadeEventArgs.cs" />
200200
<Compile Include="ClockItemButton.cs" />
201201
<Compile Include="ColorZone.cs" />
202+
<Compile Include="Converters\BooleanToVisibilityConverter.cs" />
202203
<Compile Include="Converters\BrushToRadialGradientBrushConverter.cs" />
203204
<Compile Include="Converters\CalendarDateCoalesceConverter.cs" />
204205
<Compile Include="Converters\CircularProgressBar\ArcEndPointConverter.cs" />

MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.ValidationErrorTemplate.xaml

Lines changed: 52 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,69 @@
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">
4-
3+
xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf"
4+
xmlns:converters="clr-namespace:MaterialDesignThemes.Wpf.Converters">
5+
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" TrueValue="Visible" FalseValue="Collapsed"/>
6+
57
<ControlTemplate x:Key="MaterialDesignValidationErrorTemplate">
6-
<StackPanel>
7-
<AdornedElementPlaceholder Name="Placeholder" />
8-
<wpf:CustomValidationPopup x:Name="ValidationPopup"
9-
IsOpen="True"
10-
Placement="Bottom" PlacementTarget="{Binding ElementName=Placeholder}"
11-
AllowsTransparency="True">
12-
<Border Background="{DynamicResource MaterialDesignPaper}">
13-
<Border.Resources>
14-
<DataTemplate DataType="{x:Type ValidationError}">
15-
<TextBlock Foreground="{DynamicResource ValidationErrorBrush}"
8+
<ControlTemplate.Resources>
9+
<DataTemplate DataType="{x:Type ValidationError}">
10+
<TextBlock Foreground="{DynamicResource ValidationErrorBrush}"
1611
FontSize="10"
1712
MaxWidth="250"
1813
Margin="2"
1914
TextWrapping="Wrap"
2015
Text="{Binding ErrorContent}"
2116
UseLayoutRounding="false" />
22-
</DataTemplate>
23-
</Border.Resources>
17+
</DataTemplate>
18+
</ControlTemplate.Resources>
19+
<StackPanel>
20+
<AdornedElementPlaceholder Name="Placeholder" />
21+
<Border Name="DefaultErrorViewerWrapper"
22+
Visibility="Collapsed">
23+
<Border Name="DefaultErrorViewer"
24+
Background="{DynamicResource MaterialDesignPaper}">
25+
<ContentPresenter Content="{Binding CurrentItem}" />
26+
</Border>
27+
</Border>
28+
29+
<wpf:CustomValidationPopup x:Name="ValidationPopup"
30+
IsOpen="False"
31+
Placement="Bottom" PlacementTarget="{Binding ElementName=Placeholder}"
32+
AllowsTransparency="True">
33+
<Border Background="{DynamicResource MaterialDesignPaper}">
2434
<ContentPresenter Content="{Binding CurrentItem}" />
2535
</Border>
2636
</wpf:CustomValidationPopup>
2737
</StackPanel>
2838
<ControlTemplate.Triggers>
29-
<DataTrigger Binding="{Binding ElementName=Placeholder, Path=AdornedElement.(wpf:ValidationAssist.ShowOnFocus)}" Value="True">
30-
<Setter TargetName="ValidationPopup" Property="IsOpen" Value="{Binding ElementName=Placeholder, Path=AdornedElement.IsKeyboardFocusWithin, Mode=OneWay}"/>
39+
<MultiDataTrigger>
40+
<MultiDataTrigger.Conditions>
41+
<Condition Binding="{Binding ElementName=Placeholder, Path=AdornedElement.(wpf:ValidationAssist.ShowOnFocus)}" Value="True"/>
42+
<Condition Binding="{Binding ElementName=Placeholder, Path=AdornedElement.(wpf:ValidationAssist.UsePopup)}" Value="True"/>
43+
</MultiDataTrigger.Conditions>
44+
<MultiDataTrigger.Setters>
45+
<Setter TargetName="ValidationPopup" Property="IsOpen"
46+
Value="{Binding ElementName=Placeholder, Path=AdornedElement.IsKeyboardFocusWithin, Mode=OneWay}"/>
47+
</MultiDataTrigger.Setters>
48+
</MultiDataTrigger>
49+
50+
<MultiDataTrigger>
51+
<MultiDataTrigger.Conditions>
52+
<Condition Binding="{Binding ElementName=Placeholder, Path=AdornedElement.(wpf:ValidationAssist.ShowOnFocus)}" Value="True"/>
53+
<Condition Binding="{Binding ElementName=Placeholder, Path=AdornedElement.(wpf:ValidationAssist.UsePopup)}" Value="False"/>
54+
</MultiDataTrigger.Conditions>
55+
<MultiDataTrigger.Setters>
56+
<Setter TargetName="DefaultErrorViewer" Property="Visibility"
57+
Value="{Binding ElementName=Placeholder, Path=AdornedElement.IsKeyboardFocusWithin, Mode=OneWay, Converter={StaticResource BooleanToVisibilityConverter}}"/>
58+
</MultiDataTrigger.Setters>
59+
</MultiDataTrigger>
60+
61+
<DataTrigger Binding="{Binding ElementName=Placeholder, Path=AdornedElement.(wpf:ValidationAssist.UsePopup)}" Value="True">
62+
<Setter TargetName="ValidationPopup" Property="IsOpen" Value="True"/>
63+
</DataTrigger>
64+
65+
<DataTrigger Binding="{Binding ElementName=Placeholder, Path=AdornedElement.(wpf:ValidationAssist.UsePopup)}" Value="False">
66+
<Setter TargetName="DefaultErrorViewerWrapper" Property="Visibility" Value="Visible"/>
3167
</DataTrigger>
3268
</ControlTemplate.Triggers>
3369
</ControlTemplate>

MaterialDesignThemes.Wpf/ValidationAssist.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,28 @@ public static void SetShowOnFocus(DependencyObject element, bool value)
3131
}
3232

3333
#endregion
34+
35+
#region UsePopupProperty
36+
37+
/// <summary>
38+
/// The hint property
39+
/// </summary>
40+
public static readonly DependencyProperty UsePopupProperty = DependencyProperty.RegisterAttached(
41+
"UsePopup",
42+
typeof(bool),
43+
typeof(ValidationAssist),
44+
new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.Inherits));
45+
46+
public static bool GetUsePopup(DependencyObject element)
47+
{
48+
return (bool)element.GetValue(ShowOnFocusProperty);
49+
}
50+
51+
public static void SetUsePopup(DependencyObject element, bool value)
52+
{
53+
element.SetValue(ShowOnFocusProperty, value);
54+
}
55+
56+
#endregion
3457
}
3558
}

0 commit comments

Comments
 (0)