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

TestProject.zip
0.15MB

▶ NumericValidationBehavior.cs

namespace TestProject;

/// <summary>
/// 숫자 검증 동작
/// </summary>
public static class NumericValidationBehavior
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// 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 applyValidation = (bool)newValue;

        if(applyValidation)
        {
            entry.TextChanged += entry_TextChanged;
        }
        else
        {
            entry.TextChanged -= entry_TextChanged;
        }
    }

    #endregion
    #region 엔트리 텍스트 변경시 처리하기 - entry_TextChanged(sender, e)

    /// <summary>
    /// 엔트리 텍스트 변경시 처리하기
    /// </summary>
    /// <param name="sender">이벤트 발생자</param>
    /// <param name="e">이벤트 인자</param>
    private static 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">
    <Entry
        HorizontalOptions="Center"
        VerticalOptions="Center"
        WidthRequest="200"
        local:NumericValidationBehavior.ApplyValidation="true"
        Placeholder="실수 값을 입력해 주시기 바랍니다." />
</ContentPage>
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요