Kazuki さんの Blog を補足します。
http://blogs.wankuma.com/kazuki/archive/2009/05/28/173774.aspx
WPF の Binding は TextBox に入力があってフォーカスが離れると property の set を呼びますが、
その時の INotifyPropertyChanged でのイベントには反応しません。
Binding.Converter プロパティ などがセットされていて property の 値と、
表示が変わってくるかもしれない時には INotifyPropertyChanged でのイベントに反応します。
つまり、property の set と TextBox 表示が変わる場合は Converter をつけるのが本来の形なのです。
これによって通常の場合は無駄な INotifyPropertyChanged でのイベントを無視できて処理が削減できるから反応が良くなるというわけです。
以下に例を挙げます。これならVS2008でWPFアプリケーションでも動作します。
今回 Vs2010では いちいち IValueConverter を作らせるのは手間だろうということで Converter をつけなくてもできるように配慮したようです。
using System.ComponentModel;
namespace TextBoxBindings
{
public class Person : INotifyPropertyChanged
{
#region INotifyPropertyChanged メンバ
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
#endregion
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
// 名前は大文字なのです
if (!string.IsNullOrEmpty(_name))
{
_name = _name.ToUpper();
}
OnPropertyChanged("Name");
}
}
}
}
using System;
using System.Windows;
using System.Windows.Data;
namespace TextBoxBindings
{
class ToUpperConverter : IValueConverter
{
#region IValueConverter メンバ
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is string)
{
//この場合は必要ないが・・・
return ((string) value).ToUpper();
}
return DependencyProperty.UnsetValue;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value;
}
#endregion
}
}
<Window x:Class="TextBoxBindings.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TextBoxBindings"
Title="Window1" Height="107" Width="300">
<Window.Resources>
<local:ToUpperConverter x:Key="ToUpperConverter"/>
</Window.Resources>
<Window.DataContext>
<local:Person />
</Window.DataContext>
<StackPanel>
<TextBox Text="{Binding Path=Name, Converter={StaticResource ToUpperConverter}}" />
<Button Content="Dummy" />
</StackPanel>
</Window>