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

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

2024.08.03
XML
カテゴリ: WPFC#.NET


C#のWPFでMVVMパターンを使用して、入力規則(Validation)を設定するサンプルコードを紹介します。入力規則は、ユーザーが入力したデータが正しいかどうかをチェックし、不正なデータが入力された場合にユーザーにフィードバックを提供するために使用されます。


### 手順


#### 1. プロジェクトの作成と準備


Visual Studioで新しいWPFアプリケーションプロジェクトを作成します。


#### 2. ViewModelの作成


まず、データバインディングと検証ロジックを含むViewModelを作成します。`INotifyDataErrorInfo`インターフェースを実装して、プロパティのエラーチェックを行います。


```csharp

using System.Collections;

using System.Collections.Generic;

using System.ComponentModel;

using System.Runtime.CompilerServices;


namespace WpfApp.ViewModels

{

    public class MainViewModel : INotifyPropertyChanged, INotifyDataErrorInfo

    {

        private string _name;

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


        public string Name

        {

            get => _name;

            set

            {

                _name = value;

                OnPropertyChanged();

                ValidateName();

            }

        }


        public event PropertyChangedEventHandler PropertyChanged;


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

        {

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

        }


        private void ValidateName()

        {

            ClearErrors(nameof(Name));

            if (string.IsNullOrWhiteSpace(Name))

            {

                AddError(nameof(Name), "Name cannot be empty.");

            }

            else if (Name.Length < 3)

            {

                AddError(nameof(Name), "Name must be at least 3 characters long.");

            }

        }


        #region INotifyDataErrorInfo


        public bool HasErrors => _errors.Count > 0;


        public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;


        public IEnumerable GetErrors(string propertyName)

        {

            return _errors.ContainsKey(propertyName) ? _errors[propertyName] : null;

        }


        private void AddError(string propertyName, string error)

        {

            if (!_errors.ContainsKey(propertyName))

            {

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

            }

            if (!_errors[propertyName].Contains(error))

            {

                _errors[propertyName].Add(error);

                OnErrorsChanged(propertyName);

            }

        }


        private void ClearErrors(string propertyName)

        {

            if (_errors.ContainsKey(propertyName))

            {

                _errors.Remove(propertyName);

                OnErrorsChanged(propertyName);

            }

        }


        private void OnErrorsChanged(string propertyName)

        {

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

        }


        #endregion

    }

}

```


#### 3. Viewの作成


次に、XAMLファイルでViewを作成し、エラーメッセージを表示するためのスタイルとバインディングを設定します。


```xml

<Window x:Class="WpfApp.Views.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:vm="clr-namespace:WpfApp.ViewModels"

        mc:Ignorable="d"

        Title="MainWindow" Height="200" Width="400">

    <Window.DataContext>

        <vm:MainViewModel />

    </Window.DataContext>

    <Grid>

        <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" 

                 HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" VerticalAlignment="Top" Width="360"/>

        <TextBlock Text="{Binding (Validation.Errors).CurrentItem.ErrorContent, ElementName=nameTextBox}" 

                   Foreground="Red" HorizontalAlignment="Left" Margin="10,40,0,0" VerticalAlignment="Top"/>

    </Grid>

</Window>

```


#### 4. アプリケーションのエントリポイントを設定


エントリポイントである`App.xaml`を設定し、起動時に`MainWindow`を表示するようにします。


```xml

<Application x:Class="WpfApp.App"

             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

             StartupUri="Views/MainWindow.xaml">

    <Application.Resources>


    </Application.Resources>

</Application>

```


### 完成したプロジェクト構造


```

WpfApp

├── App.xaml

├── App.xaml.cs

├── ViewModels

│   └── MainViewModel.cs

├── Views

│   └── MainWindow.xaml

│   └── MainWindow.xaml.cs

```


### 実行結果


アプリケーションを実行すると、`TextBox`に名前を入力できるようになります。名前が空であるか、3文字未満の場合、エラーメッセージが表示されます。これは、`INotifyDataErrorInfo`インターフェースを実装することで、入力の検証とエラーメッセージの表示を実現しています。


この例をベースに、他のプロパティに対する入力規則を追加することで、より複雑な検証ロジックを実装できます。






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

Last updated  2024.08.03 12:17:51


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

© Rakuten Group, Inc.
X
Mobilize your Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: