From aa67dea033f0846c9e69de60efa0a44fe4d5943f Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Wed, 6 Aug 2025 22:09:56 +0800 Subject: [PATCH] chore: add avalonia DataValidationErrors demo. --- .../HandyControlDemo_Avalonia/App.axaml.cs | 16 +- .../UserControl/Styles/TextBoxDemo.axaml | 13 +- .../Common/InputElementDemoViewModel.cs | 19 ++ .../ViewModel/DemoViewModelBase`1.cs | 10 +- .../ViewModel/ViewModelLocator.cs | 3 + .../Themes/Styles/DataValidationErrors.axaml | 50 +++ .../Themes/Styles/TextBox.axaml | 291 +++++++++--------- .../HandyControl_Avalonia/Themes/Theme.axaml | 6 +- 8 files changed, 246 insertions(+), 162 deletions(-) create mode 100644 src/Avalonia/HandyControlDemo_Avalonia/ViewModel/Common/InputElementDemoViewModel.cs create mode 100644 src/Avalonia/HandyControl_Avalonia/Themes/Styles/DataValidationErrors.axaml diff --git a/src/Avalonia/HandyControlDemo_Avalonia/App.axaml.cs b/src/Avalonia/HandyControlDemo_Avalonia/App.axaml.cs index af611b2c..78d6b88e 100644 --- a/src/Avalonia/HandyControlDemo_Avalonia/App.axaml.cs +++ b/src/Avalonia/HandyControlDemo_Avalonia/App.axaml.cs @@ -1,4 +1,5 @@ using System.Globalization; +using System.Linq; using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Data.Core.Plugins; @@ -17,7 +18,7 @@ public class App : Application public override void OnFrameworkInitializationCompleted() { Properties.Langs.Lang.Culture = new CultureInfo("en"); - BindingPlugins.DataValidators.RemoveAt(0); + RemoveDefaultDataValidator(); if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { @@ -26,4 +27,17 @@ public class App : Application base.OnFrameworkInitializationCompleted(); } + + private static void RemoveDefaultDataValidator() + { + // Get an array of plugins to remove + var dataValidationPluginsToRemove = + BindingPlugins.DataValidators.OfType().ToArray(); + + // remove each entry found + foreach (var plugin in dataValidationPluginsToRemove) + { + BindingPlugins.DataValidators.Remove(plugin); + } + } } diff --git a/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/TextBoxDemo.axaml b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/TextBoxDemo.axaml index 5ba14391..44cafce7 100644 --- a/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/TextBoxDemo.axaml +++ b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/TextBoxDemo.axaml @@ -1,12 +1,9 @@ + xmlns:vm="clr-namespace:HandyControlDemo.ViewModel" + x:Class="HandyControlDemo.UserControl.TextBoxDemo" + DataContext="{Binding InputElementDemo, Source={x:Static vm:ViewModelLocator.Instance}}"> : ObservableObject +public partial class DemoViewModelBase : ObservableObject { - private IList _dataList = []; - - public IList DataList - { - get => _dataList; - set => SetProperty(ref _dataList, value); - } + [ObservableProperty] private IList _dataList = []; } diff --git a/src/Avalonia/HandyControlDemo_Avalonia/ViewModel/ViewModelLocator.cs b/src/Avalonia/HandyControlDemo_Avalonia/ViewModel/ViewModelLocator.cs index fe5a432e..76a3c563 100644 --- a/src/Avalonia/HandyControlDemo_Avalonia/ViewModel/ViewModelLocator.cs +++ b/src/Avalonia/HandyControlDemo_Avalonia/ViewModel/ViewModelLocator.cs @@ -19,9 +19,12 @@ public class ViewModelLocator services.AddSingleton(); services.AddTransient(); + services.AddTransient(); _serviceProvider = services.BuildServiceProvider(); } public MainViewModel Main => _serviceProvider.GetService()!; + + public InputElementDemoViewModel InputElementDemo => _serviceProvider.GetService()!; } diff --git a/src/Avalonia/HandyControl_Avalonia/Themes/Styles/DataValidationErrors.axaml b/src/Avalonia/HandyControl_Avalonia/Themes/Styles/DataValidationErrors.axaml new file mode 100644 index 00000000..48603a48 --- /dev/null +++ b/src/Avalonia/HandyControl_Avalonia/Themes/Styles/DataValidationErrors.axaml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Avalonia/HandyControl_Avalonia/Themes/Styles/TextBox.axaml b/src/Avalonia/HandyControl_Avalonia/Themes/Styles/TextBox.axaml index f34c0f34..b1dc22e5 100644 --- a/src/Avalonia/HandyControl_Avalonia/Themes/Styles/TextBox.axaml +++ b/src/Avalonia/HandyControl_Avalonia/Themes/Styles/TextBox.axaml @@ -97,6 +97,11 @@ + + - - - - - - - - - - - + + + + + + + + + + + + + @@ -218,77 +224,78 @@ TextTrimming="CharacterEllipsis" Text="{Binding Path=(hc:TitleElement.Title), RelativeSource={RelativeSource TemplatedParent}}" /> - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/src/Avalonia/HandyControl_Avalonia/Themes/Theme.axaml b/src/Avalonia/HandyControl_Avalonia/Themes/Theme.axaml index 78f68c95..f0f8220b 100644 --- a/src/Avalonia/HandyControl_Avalonia/Themes/Theme.axaml +++ b/src/Avalonia/HandyControl_Avalonia/Themes/Theme.axaml @@ -15,6 +15,7 @@ + @@ -39,9 +40,4 @@ - -