첨부 소스 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

TestProject.zip
0.15MB

▶ NumericValidationBehavior.cs

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
}

 

728x90

 

▶ MainPage.xaml

<?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>
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요