Skip to content
This repository was archived by the owner on May 1, 2024. It is now read-only.

Commit 5b8facc

Browse files
Add VSM to ValidationBehavior (#955)
* Add VSM to ValidationBehavior * dumb commit: Re trigger CI * Fix typo * Fix typo Co-authored-by: Andrei <[email protected]> * Change string properties to public * Apply Pascal Case Naming * Update src/CommunityToolkit/Xamarin.CommunityToolkit/Behaviors/Validators/ValidationBehavior.shared.cs * Update src/CommunityToolkit/Xamarin.CommunityToolkit/Behaviors/Validators/ValidationBehavior.shared.cs * Update src/CommunityToolkit/Xamarin.CommunityToolkit/Behaviors/Validators/ValidationBehavior.shared.cs * Update src/CommunityToolkit/Xamarin.CommunityToolkit/Behaviors/Validators/ValidationBehavior.shared.cs * Update src/CommunityToolkit/Xamarin.CommunityToolkit/Behaviors/Validators/ValidationBehavior.shared.cs Co-authored-by: Andrei <[email protected]>
1 parent 48ec2e4 commit 5b8facc

File tree

2 files changed

+69
-40
lines changed

2 files changed

+69
-40
lines changed
Lines changed: 57 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,91 @@
11
<?xml version="1.0" encoding="UTF-8" ?>
2-
<pages:BasePage xmlns="http://xamarin.com/schemas/2014/forms"
2+
<pages:BasePage x:Name="Page"
3+
x:Class="Xamarin.CommunityToolkit.Sample.Pages.Behaviors.CharactersValidationBehaviorPage"
4+
xmlns="http://xamarin.com/schemas/2014/forms"
35
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
46
xmlns:xct="http://xamarin.com/schemas/2020/toolkit"
5-
xmlns:pages="clr-namespace:Xamarin.CommunityToolkit.Sample.Pages"
6-
x:Name="Page"
7-
x:Class="Xamarin.CommunityToolkit.Sample.Pages.Behaviors.CharactersValidationBehaviorPage">
7+
xmlns:pages="clr-namespace:Xamarin.CommunityToolkit.Sample.Pages">
88

99
<pages:BasePage.Resources>
1010
<Style x:Key="InvalidEntryStyle"
1111
TargetType="Entry">
12-
<Setter Property="TextColor"
13-
Value="Red" />
12+
<Setter Property="TextColor" Value="Red"/>
13+
</Style>
14+
15+
<Style x:Key="ValidEntryStyle"
16+
TargetType="Entry">
17+
<Setter Property="TextColor" Value="Green"/>
1418
</Style>
1519
</pages:BasePage.Resources>
1620

1721
<StackLayout Padding="{StaticResource ContentPadding}"
1822
Spacing="25"
1923
VerticalOptions="StartAndExpand">
20-
<Label Text="Text color will change accordingly to the style that is configured when an invalid string is entered." />
24+
<Label Text="Text color will change accordingly to the style that is configured when an invalid string is entered."/>
2125
<Frame Margin="{StaticResource ContentPadding}"
2226
CornerRadius="10">
2327
<Grid>
2428
<Grid.RowDefinitions>
25-
<RowDefinition Height="Auto" />
26-
<RowDefinition Height="Auto" />
27-
<RowDefinition Height="Auto" />
29+
<RowDefinition Height="Auto"/>
30+
<RowDefinition Height="Auto"/>
31+
<RowDefinition Height="Auto"/>
2832
</Grid.RowDefinitions>
2933
<Grid.ColumnDefinitions>
30-
<ColumnDefinition Width="*" />
31-
<ColumnDefinition Width="*" />
34+
<ColumnDefinition Width="*"/>
35+
<ColumnDefinition Width="*"/>
3236
</Grid.ColumnDefinitions>
33-
<Label Text="CharacterType" />
34-
<Picker x:Name="CharacterTypePicker"
37+
<Label Text="CharacterType"/>
38+
<Picker x:Name="CharacterTypePicker" Grid.Column="1"
3539
Title="CharacterType"
36-
Grid.Column="1"
37-
ItemsSource="{Binding CharacterTypes,
38-
Source={x:Reference Page}}"
39-
SelectedIndex="1" />
40+
ItemsSource="{Binding CharacterTypes, Source={x:Reference Page}}"
41+
SelectedIndex="1"/>
4042
<Label Grid.Row="1"
41-
Text="MinimumCharacterCountEntry" />
42-
<Entry x:Name="MinimumCharacterCountEntry"
43-
Grid.Row="1"
44-
Grid.Column="1"
43+
Text="MinimumCharacterCountEntry"/>
44+
<Entry x:Name="MinimumCharacterCountEntry" Grid.Row="1" Grid.Column="1"
4545
Keyboard="Numeric"
46-
Text="2" />
46+
Text="2"/>
4747
<Label Grid.Row="2"
48-
Text="MaximumCharacterCountEntry" />
49-
<Entry x:Name="MaximumCharacterCountEntry"
50-
Grid.Row="2"
51-
Grid.Column="1"
48+
Text="MaximumCharacterCountEntry"/>
49+
<Entry x:Name="MaximumCharacterCountEntry" Grid.Row="2" Grid.Column="1"
5250
Keyboard="Numeric"
53-
Text="20" />
51+
Text="20"/>
5452
</Grid>
5553
</Frame>
56-
<Label Text="Type characters for validation behavior according to the settings you set upon." />
54+
<Label Text="Type characters for validation behavior according to the settings you set upon."/>
5755
<Entry Placeholder="Type characters...">
5856
<Entry.Behaviors>
59-
<xct:CharactersValidationBehavior CharacterType="{Binding SelectedItem,
60-
Source={x:Reference CharacterTypePicker}}"
57+
<xct:CharactersValidationBehavior CharacterType="{Binding SelectedItem, Source={x:Reference CharacterTypePicker}}"
6158
InvalidStyle="{StaticResource InvalidEntryStyle}"
62-
MaximumCharacterCount="{Binding Text,
63-
Source={x:Reference MaximumCharacterCountEntry}}"
64-
MinimumCharacterCount="{Binding Text,
65-
Source={x:Reference MinimumCharacterCountEntry}}" />
59+
ValidStyle="{StaticResource ValidEntryStyle}"
60+
MaximumCharacterCount="{Binding Text, Source={x:Reference MaximumCharacterCountEntry}}"
61+
MinimumCharacterCount="{Binding Text, Source={x:Reference MinimumCharacterCountEntry}}"/>
62+
</Entry.Behaviors>
63+
</Entry>
64+
65+
<Label Text="The same but styling handled by visual state manager."/>
66+
<Entry Placeholder="Type characters...">
67+
<Entry.Behaviors>
68+
<xct:CharactersValidationBehavior Flags="ValidateOnValueChanging"
69+
CharacterType="{Binding SelectedItem, Source={x:Reference CharacterTypePicker}}"
70+
MaximumCharacterCount="{Binding Text, Source={x:Reference MaximumCharacterCountEntry}}"
71+
MinimumCharacterCount="{Binding Text, Source={x:Reference MinimumCharacterCountEntry}}"/>
6672
</Entry.Behaviors>
73+
74+
<VisualStateManager.VisualStateGroups>
75+
<VisualStateGroup x:Name="CommonStates">
76+
<VisualState x:Name="Valid">
77+
<VisualState.Setters>
78+
<Setter Property="TextColor" Value="Green"/>
79+
</VisualState.Setters>
80+
</VisualState>
81+
<VisualState x:Name="Invalid">
82+
<VisualState.Setters>
83+
<Setter Property="TextColor" Value="IndianRed"/>
84+
</VisualState.Setters>
85+
</VisualState>
86+
</VisualStateGroup>
87+
</VisualStateManager.VisualStateGroups>
6788
</Entry>
89+
6890
</StackLayout>
6991
</pages:BasePage>

src/CommunityToolkit/Xamarin.CommunityToolkit/Behaviors/Validators/ValidationBehavior.shared.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ namespace Xamarin.CommunityToolkit.Behaviors.Internals
1111
/// </summary>
1212
public abstract class ValidationBehavior : BaseBehavior<VisualElement>
1313
{
14+
public const string ValidVisualState = "Valid";
15+
16+
public const string InvalidVisualState = "Invalid";
17+
1418
/// <summary>
1519
/// Backing BindableProperty for the <see cref="IsNotValid"/> property.
1620
/// </summary>
@@ -291,12 +295,15 @@ async ValueTask UpdateStateAsync(bool isForced, CancellationToken? parentToken =
291295

292296
void UpdateStyle()
293297
{
294-
if (View == null || (ValidStyle ?? InvalidStyle) == null)
298+
if (View == null)
299+
return;
300+
301+
VisualStateManager.GoToState(View, IsValid ? ValidVisualState : InvalidVisualState);
302+
303+
if ((ValidStyle ?? InvalidStyle) == null)
295304
return;
296305

297-
View.Style = IsValid
298-
? ValidStyle
299-
: InvalidStyle;
306+
View.Style = IsValid ? ValidStyle : InvalidStyle;
300307
}
301308

302309
void ResetValidationTokenSource(CancellationTokenSource newTokenSource)
@@ -305,4 +312,4 @@ void ResetValidationTokenSource(CancellationTokenSource newTokenSource)
305312
validationTokenSource = newTokenSource;
306313
}
307314
}
308-
}
315+
}

0 commit comments

Comments
 (0)