銀行コードを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;
}
こんな感じにしたらうまくいった。
思ったより面倒くさかった。なんでプロパティの値変えただけじゃダメなんだろ?