郵便番号に自動的でハイフンを挿入する

Converterの作成

IValueConverterを実装したConverterクラスを作成する。

using System;
using System.Globalization;
using System.Text.RegularExpressions;
using System.Windows.Data;

namespace AddressBook.converter
{
    internal class ZipConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string zip = (string)value;
            if (Regex.IsMatch(zip, @"^[0-9]{7}$") == true)
                return string.Format("{0:000-0000}", int.Parse(zip));
            return zip;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string zip = (string)value;
            if (Regex.IsMatch(zip, @"^[0-9]{3}-[0-9]{4}$") == true)
                return zip.Replace("-", "");
            return zip;
        }
    }
}

実装するメソッドはConvertとConvertBackの2つ。

Convertには表示用に変換するコードを書く。今回の場合はstring型のZipCodeプロパティに「0310112」が設定されていると表示用に「031-0112」が戻り値となりそれが表示される。

ConvertBackは逆でstring型のZipCodeプロパティに「031-0112」が設定されていると読み取り時に「0310112」が取得できる。ご丁寧にハイフンを入力したりハイフン込みの文字列をペーストした場合なども常にハイフンなし文字列が取得できる。

XAML

Converterクラスを作成したらXAMLを記述する。

<Window x:Class="AddressBook.EditWindow"
        xmlns:local="clr-namespace:AddressBook"
        xmlns:cnv="clr-namespace:AddressBook.converter"
    <Window.Resources>
        <cnv:ZipConverter x:Key="ZipConverter"/>
    </Window.Resources>

        <TextBox x:Name="textZip" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="2" Margin="4,4,4,4">
            <TextBox.Text>
                <Binding Converter="{StaticResource ZipConverter}" Path="ZipCode" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>
                        <val:ZipValidationRule ValidatesOnTargetUpdated="True"/>
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>

Window.Resourcesに作成したConverterクラスを記述してTextBoxなどのBindingに指定する感じ。UpdateSourceTrigger=”PropertyChanged”としておくと1文字入力する毎にConvertメソッドが呼ばれる。まとめてドンと貼り付けた場合も同様。今回の実装ではいずれの場合も(先頭から末尾まで0-9が7桁で構成されている)正規表現にマッチした場合、ハイフンが挿入される。WinFormsだとkeypressやfocusleaveなどにガリガリとコードを書く必要があるけどwpfではConverterクラスを作成してXAMLにタグを記述すればよいのでラクチン。

ViewModel

一応ViewModelも置いておく。プロパティが定義されているだけだけど。

using Prism.Mvvm;

internal class EditWindowViewModel : BindableBase
{
    private string _zipCode = string.Empty;
    public string ZipCode
    {
        get
        {
            return _zipCode;
        }
        set
        {
            SetProperty(ref _zipCode, value);
        }
    }
}

コードビハインド

ViewModel設定している箇所だけコードビハインドもペタリ。

public class EditWindow : Window
{
    private EditWindowViewModel VM { get; set; }

    public EditWindow()
    {
        InitializeComponent();
        VM = new EditWindowViewModel();
        DataContext = VM;
    }
}

トップページ

コメント

タイトルとURLをコピーしました