良い題名が浮かばなかったので、やったことをそのままダラダラと題名にしています。
Powershellでちょっとしたフォームを作りたいので、その勉強のために作成したサンプルです。
Xamlちょっと面白いかも。
PowershellでINotifyPropertyChanged
Xamlの INotifyPropertyChanged のコツは、potimarimo – Qiita さんのサイトを参考にExpandoObjectを使用。
まず、Xaml上は、FirstName と LastName を定義しbinding
1 2 |
<span class="fz-14px"><TextBox Name="FirstName" Text="{Binding FirstName, UpdateSourceTrigger=PropertyChanged}" /> <TextBox Name="LastName" Text="{Binding LastName, UpdateSourceTrigger=PropertyChanged}" /></span> |
Powershellでは、ExpandoObjectを生成、FirstName/LastNameをメンバーを追加した後に、Xamlファイルを元にWindowフォーム化したオブジェクトにExpandoObjectをDataContextさせている。
これにより、FirstName1/LastName1 と FirstName2/LastName2が連動する仕組みになっている。
フォーム上で文字列結合
ここは、PowershellというよりもXamlの流儀で対応する。
まずFirstName1とLastName1を構成するTextBoxにそれぞれ名前つける。FirstName1用のTextBoxには、NameにFirstName、LastName1用のTextBoxのNameにLastNameを指定する。
次にMultiBindingを指定。
MultiBindingに、Binding 先となる「TextBoxの」Text、引用先となるElementNameにFirstName/LastNameを指定。
肝になる部分は以下
1 2 3 4 5 6 7 8 9 10 |
・・・<span class="fz-14px"> </span> <span class="fz-14px"><TextBox Name="FirstName" Text="{Binding FirstName, UpdateSourceTrigger=PropertyChanged}" /> </span>・・・ <span class="fz-14px"> <TextBox Name="LastName" Text="{Binding LastName, UpdateSourceTrigger=PropertyChanged}" /></span> ・・・ <span class="fz-14px"><MultiBinding StringFormat="{}{0} {1}"> <Binding Path="Text" ElementName="FirstName" /> <Binding Path="Text" ElementName="LastName" /> </span> <span class="fz-14px"></MultiBinding></span> |
参考
実行結果例
起動時
Taro papanda と入力した場合
FirstName1やLastName1 FirsName2やLastName2を個々に変更してもすべて同期する。
更に、Join FirstName And LastName に FirsName や LastName が結合された文字列が出現する。
参考にさせて頂いたサイト
PowerShellでWPFを使う #PowerShell – Qiita
C#WPFの道#2!StackPanelの使い方をわかりやすく解説!|ピーコックアンダーソン (anderson02.com)
コメント