■ Behavior<T> 클래스를 사용해 실수 값 검증 동작을 만드는 방법을 보여준다. (기능 개선)
▶ NumericValidationBehavior.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
namespace TestProject; /// <summary> /// 숫자 검증 동작 /// </summary> public class NumericValidationBehavior : Behavior<Entry> { //////////////////////////////////////////////////////////////////////////////////////////////////// Bindable Property ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 검증 적용 여부 속성 - ApplyValidationProperty /// <summary> /// 검증 적용 여부 속성 /// </summary> public static readonly BindableProperty ApplyValidationProperty = BindableProperty.CreateAttached ( "ApplyValidation", typeof(bool), typeof(NumericValidationBehavior), false, propertyChanged : ApplyValidationPropertyChangedCallback ); #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 검증 적용 여부 구하기 - GetApplyValidation(bo) /// <summary> /// 검증 적용 여부 구하기 /// </summary> /// <param name="bo">바인딩 객체</param> /// <returns>검증 적용 여부</returns> public static bool GetApplyValidation(BindableObject bo) { return (bool)bo.GetValue(ApplyValidationProperty); } #endregion #region 검증 적용 여부 설정하기 - SetApplyValidation(bo, value) /// <summary> /// 검증 적용 여부 설정하기 /// </summary> /// <param name="bo">바인딩 객체</param> /// <param name="value">검증 적용 여부</param> public static void SetApplyValidation(BindableObject bo, bool value) { bo.SetValue(ApplyValidationProperty, value); } #endregion //////////////////////////////////////////////////////////////////////////////// Private #region 검증 적용 여부 속성 변경시 콜백 처리하기 - ApplyValidationPropertyChangedCallback(bo, previousValue, newValue) /// <summary> /// 검증 적용 여부 속성 변경시 콜백 처리하기 /// </summary> /// <param name="bo">바인딩 객체</param> /// <param name="previousValue">이전 값</param> /// <param name="newValue">신규 값</param> private static void ApplyValidationPropertyChangedCallback(BindableObject bo, object previousValue, object newValue) { Entry entry = bo as Entry; if(entry == null) { return; } bool attachBehavior = (bool)newValue; if(attachBehavior) { entry.Behaviors.Add(new NumericValidationBehavior()); } else { Behavior toRemove = entry.Behaviors.FirstOrDefault(b => b is NumericValidationBehavior); if(toRemove != null) { entry.Behaviors.Remove(toRemove); } } } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Instance //////////////////////////////////////////////////////////////////////////////// Protected #region 부착시 처리하기 - OnAttachedTo(entry) /// <summary> /// 부착시 처리하기 /// </summary> /// <param name="entry">엔트리</param> protected override void OnAttachedTo(Entry entry) { entry.TextChanged += entry_TextChanged; base.OnAttachedTo(entry); } #endregion #region 탈착시 처리하기 - OnDetachingFrom(entry) /// <summary> /// 탈착시 처리하기 /// </summary> /// <param name="entry">엔트리</param> protected override void OnDetachingFrom(Entry entry) { entry.TextChanged -= entry_TextChanged; base.OnDetachingFrom(entry); } #endregion //////////////////////////////////////////////////////////////////////////////// Private #region 엔트리 텍스트 변경시 처리하기 - entry_TextChanged(sender, e) /// <summary> /// 엔트리 텍스트 변경시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void entry_TextChanged(object sender, TextChangedEventArgs e) { double result; bool isValid = double.TryParse(e.NewTextValue, out result); ((Entry)sender).TextColor = isValid ? Colors.Black : Colors.Red; } #endregion } |
▶ MainPage.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?xml version="1.0" encoding="utf-8" ?> <ContentPage x:Class="TestProject.MainPage" xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:TestProject"> <ContentPage.Resources> <Style x:Key="NumericValidationStyleKey" TargetType="Entry"> <Style.Setters> <Setter Property="local:NumericValidationBehavior.ApplyValidation" Value="true" /> </Style.Setters> </Style> </ContentPage.Resources> <Entry Style="{StaticResource NumericValidationStyleKey}" HorizontalOptions="Center" VerticalOptions="Center" WidthRequest="200" Placeholder="실수 값을 입력해 주시기 바랍니다." /> </ContentPage> |