「東雲 忠太郎」の平凡な日常のできごと

「東雲 忠太郎」の平凡な日常のできごと

2024.03.31
XML
カテゴリ: C#.NET


`INotifyPropertyChanged` インターフェースでは、プロパティの変更通知のみを提供します。エラーの追跡や取得には、`IDataErrorInfo` インターフェースまたは `INotifyDataErrorInfo` インターフェースを使用する必要があります。以下に、`INotifyDataErrorInfo` を使用してエラーを取得するサンプルコードを示します。


```csharp

using System;

using System.Collections;

using System.Collections.Generic;

using System.ComponentModel;

using System.Runtime.CompilerServices;


namespace PropertyChangedErrorExample

{

    public class Person : INotifyPropertyChanged, INotifyDataErrorInfo

    {

        private string name;

        public string Name

        {

            get { return name; }

            set

            {

                if (name != value)

                {

                    name = value;

                    OnPropertyChanged();

                    ValidateProperty(nameof(Name), value);

                }

            }

        }


        private int age;

        public int Age

        {

            get { return age; }

            set

            {

                if (age != value)

                {

                    age = value;

                    OnPropertyChanged();

                    ValidateProperty(nameof(Age), value);

                }

            }

        }


        private Dictionary<string, List<string>> errors = new Dictionary<string, List<string>>();


        public event PropertyChangedEventHandler PropertyChanged;

        public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;


        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)

        {

            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

        }


        private void ValidateProperty(string propertyName, object value)

        {

            // エラーのクリア

            if (errors.ContainsKey(propertyName))

            {

                errors.Remove(propertyName);

                OnErrorsChanged(propertyName);

            }


            // 具体的な検証ルールを適用し、エラーがあればエラーメッセージを追加

            if (propertyName == nameof(Name))

            {

                if (string.IsNullOrWhiteSpace(value as string))

                {

                    AddError(propertyName, "名前を入力してください。");

                }

            }

            else if (propertyName == nameof(Age))

            {

                if ((int)value < 0 || (int)value > 150)

                {

                    AddError(propertyName, "年齢は0から150の間で入力してください。");

                }

            }

        }


        private void AddError(string propertyName, string error)

        {

            if (!errors.ContainsKey(propertyName))

            {

                errors[propertyName] = new List<string>();

            }


            errors[propertyName].Add(error);

            OnErrorsChanged(propertyName);

        }


        public IEnumerable GetErrors(string propertyName)

        {

            if (errors.ContainsKey(propertyName))

            {

                return errors[propertyName];

            }

            else

            {

                return null;

            }

        }


        public bool HasErrors => errors.Count > 0;


        protected virtual void OnErrorsChanged(string propertyName)

        {

            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));

        }

    }

}

```


この `Person` クラスは `INotifyPropertyChanged` と `INotifyDataErrorInfo` を実装しています。プロパティの値が変更されるたびに `OnPropertyChanged` メソッドが呼び出され、また、プロパティの値が変更された後には `ValidateProperty` メソッドが呼び出され、そのプロパティの値の妥当性を検証します。検証の結果、エラーがあれば `AddError` メソッドを使用してエラーを追加します。そして、`INotifyDataErrorInfo` インターフェースの実装により、`GetErrors` メソッドを使用してエラーを取得し、`ErrorsChanged` イベントを使用してエラーが変更されたことを通知します。


このようにして、`INotifyPropertyChanged` インターフェースを使用してプロパティの変更通知と、`INotifyDataErrorInfo` インターフェースを使用してエラーの追跡や取得が行われます。






お気に入りの記事を「いいね!」で応援しよう

Last updated  2024.03.31 13:59:02


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

© Rakuten Group, Inc.
Create a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: