読者です 読者をやめる 読者になる 読者になる

続・複数のテキストボックスを同期したい(WPF + DataBinding編)

本日のテーマ

昨日と同じテーマです。もっといいやり方を思いついたので再挑戦します。

  • 1つのウィンドウの中に複数のテキストボックスが配置されたWPFアプリを考える
  • テキストボックスのどれかを変更すると、他のテキストボックスにもすべて同じ変更が適用されるようにしたい

昨日のコードは長すぎた

昨日はわざわざ拡張メソッドを作ったり、独自の制御機構を作ったり、ブログに載せるためにソースの改行位置をかわいらしくアレンジしたりといろいろ手を尽くしたわけです。

しかし、XAML をほんのちょっといじるだけでいとも簡単に昨日の問題が解決してしまいました。

C# なんか要らなかったんや。

昨日あれだけ気合を入れてサンプルを作ったのに……。

やったこと

XAML をエディタで開いて、各テキストボックスにデータバインディングを追加しただけす。

textBox1textBox3を、textBox2textBox1を、textBox3textBox2を、それぞれバインドしています。

本当にたったこれだけ。

Mainwindow.xaml

<Window x:Class="Sample150717_WPF_.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBox x:Name="textBox1" Height="23" Margin="10,10,10,0" Text="{Binding ElementName=textBox3, Path=Text}" VerticalAlignment="Top"/>
        <TextBox x:Name="textBox2" Height="23" Margin="10,40,10,0" Text="{Binding ElementName=textBox1, Path=Text}" VerticalAlignment="Top"/>
        <TextBox x:Name="textBox3" Height="23" Margin="10,70,10,0" Text="{Binding ElementName=textBox2, Path=Text}" VerticalAlignment="Top"/>
    </Grid>
</Window>

ちなみにC#のコードは以下の通り。人の手が入った形跡すらない。

Mainwindow.xaml.cs

using System.Windows;

namespace Sample150717_WPF_
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

どこが改善されたのか

  • タイプ数が減った
    純粋に、コーディング時のタイプ数が減りました。キーボードに対する打鍵時の物理的ダメージが軽減するのでキーボードが長持ちし、お財布に優しくなりました。
  • 本質ではない制御をC#から排除できた
    XAMLにできることはXAMLにやらせる。それによってC#のメタボ化を防ぐことができました。このシンプル極まりない今回のコードを見よ!
  • 何をしたいのかが分かりやすくなった
    前回のサンプルは、珍妙なラムダ式がいっぱい出てきて、最終目的が分かりづらいコードになっていました(まぁイベント制御の特性上ある程度は致し方ないことですが)。今回はXAML側に「テキストボックスにデータをバインドする」というそのものズバリの記載があるので、可読性が上がりました。

反省

中国の故事に「守株」という成語があります。意味は、「いつまでも古い習慣にこだわって、全く進歩がないこと。臨機応変の能力がないこと」だそうです。

僕は昨日、いにしえのWinodowsフォームアプリケーションのノリで、冗長なC#コードをふんだんに散りばめたサンプルコードを書いてしまいました。

より良いやり方が存在するにも関わらず、僕は無意識のうちに過去の方法論に縛られてしまっていました。そう、まるで過去にちょっとうまく行ったサルのように。

プログラマの三大美徳の一つである「怠惰さ」が足りない*1と痛感した次第であります。

( ・ω・)ノ――――――――――――――@ ショボボボボーーーン

*1:怠惰さが足りない人は、敢えて手数の多いコードを書くらしい。

Copyright (c) 2012 @tercel_s, @iTercel, @pi_cro_s.