LoginSignup
7
11

More than 5 years have passed since last update.

wpfのBindingでハマり

Last updated at Posted at 2018-08-03

銀行コードをTextBoxに入力すると、銀行名が自動で別のTextBoxに入るようにしたい。
簡単やん?と思って始めたが、ぜんぜんできなかった。

Viewはこんな感じ。

<TextBox Text={Binding BankCode, Mode=TwoWay, UpdateSourceTrigger=LostFocus}/>
<TextBox Text={Binding BankName, Mode=TwoWay} IsReadOnly="true"/>

ViewModelはこんな感じ

public class BankViewModel
{
    public string BankCode { get { return bankCode; }
        set
        {
            bankCode = value;
            BankName = 銀行コードを渡して銀行名を取得する関数(bankCode);
        }
    }
    private string bankCode = string.Empty;

    public string BankName { get; set; } = string.Empty;
}

で、これで銀行コードのテキストボックスに0001と入力する。
銀行コードを渡して銀行名を取得する関数()が"みずほ"を返す。
BankNameに"みずほ"が入る。

ところまでは良かった。
でもViewに全然反映されない。

試しに、

public string BankName { get; set; } = "ほげ";

に変えたら、ちゃんとTextBoxには"ほげ"が初期表示されている。ということは、Bindingの設定は間違っていない。じゃあなんでなんだぜ?ってなって数時間。
ModeをOneWayに変えたり、UpdateSourceTriggerをPropertyChangedに変えても全然ダメ。

検索して、ここにたどり着いた。
https://qiita.com/soi/items/d0c83a0cc3a4b23237ef

以下写経

using System.ComponentModel;
using System.Runtime.CompilerServices;

public class BankViewModel : INotifyPropertyChanged
{

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged([CallerMemberName]string propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    public string BankCode { get { return bankCode; }
        set
        {
            bankCode = value;
            BankName = 銀行コードを渡して銀行名を取得する関数(bankCode);

            RaisePropertyChanged();
            RaisePropertyChanged(nameof(BankName));
        }
    }
    private string bankCode = string.Empty;

    public string BankName { get; set; } = string.Empty;
}

こんな感じにしたらうまくいった。
思ったより面倒くさかった。なんでプロパティの値変えただけじゃダメなんだろ?

7
11
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
11