[WPF] TextBox でフォーカス移動時に値が変更されていた場合だけ処理をしたい

TextBox からフォーカスが抜けた際に画面の他の項目をその TextBox の値に応じて変更したい場合があります。
よくある例としては、
・何らかの計算をして計算結果を他の項目に表示する。
・コードを入力して対になる名称を他の項目に表示する。
などがあります。
単純に実装するならば、LostFocus イベントで計算もしくは名称の取得処理を行うことになると思います。
しかしその処理が重い場合、処理が必要ない場合(前回の処理時と同じ値が入力されている場合)は処理をせずに済ませたいものです。

いろいろな実装方法があると思いますが、拡張 TextBox コントロールを作って、値が変更されて LostFocus した場合に独自のイベントを発行するのが手っ取り早いと思います。
次の例では、独自の InputTextChanged を発行しています。

namespace WpfApplication1
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void MyTextBox_InputTextChanged(object sender, EventArgs e)
        {
            MessageBox.Show("InputTextChanged");
        }
    }

    internal class MyTextBox : TextBox
    {
        public event EventHandler InputTextChanged;
        public MyTextBox()
        {
            var oldVal = string.Empty;
            this.GotFocus += (sender, e) => { oldVal = this.Text; };
            this.LostFocus += (sender, e) => { if (oldVal != this.Text && InputTextChanged != null) { InputTextChanged(sender, e); } };
        }
    }
}
<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1" x:Class="WpfApplication1.MainWindow"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <local:MyTextBox InputTextChanged="MyTextBox_InputTextChanged" />
            <local:MyTextBox />
        </StackPanel>
    </Grid>
</Window>

コントロールを使う側(Window クラス)では、 InputTextChanged のイベントハンドラを作ってそこで計算処理なり名称取得処理などを記述すれば OK です。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中