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;
}
}
コメント