同一ウインドウ内でコントロールを連動させる
たとえば、以下のコントロールを連動させたいとする。
<TextBox x:Name="Txt1" Text="あいうえお"/>
<TextBox x:Name="Txt2" Text="かきくけこ"/>
x:Name="Txt1"のTextと同じテキストが、x:Name="Txt2"のTextにリアルタイムで表示されるようにしたい。
そんなとき、どうやって書けばいいかというと。
<TextBox x:Name="Txt1" Text="あいうえお"/>
<TextBox x:Name="Txt2" Text="{Binding ElementName=Txt1, Path=Text}"/>
これでx:Name="Txt2"は、自身のText部分にx:Name="Txt1"のTextを動的に読み込むようになる。
x:Name="Txt1"を編集したら、自動的にx:Name="Txt2"も変更されるようになる。
ちなみに、このBindingは指向性があって、以下のようにMode=を書き足すと指定できる。
{Binding ElementName=Txt1, Path=Text, Mode=TwoWay}
Modeは、OneTime、OneWay、TwoWay、OneWayToSourceなどがある。
[OneTime]はアプリケーション起動時にのみ変更。
[OneWay]は相手が変更されたときに自分が変更される。
[TwoWay]は自分も相手も変更しあう。だから双方向で連動させたいときはTwoWay。
[OneWayToSource]は自分が変更されたときに相手が変更される。
アプリケーション設定からコントロールを連動させる
以下はProperties.Settings.Defaultに保存してある設定からコントロールを連動させる方法。
たとえばMyAppNamespaceというnamespaceを持ったアプリケーションにて、SaveDateという名前の設定を利用したいとする。
- XAMLの<Window>に『xmlns:properties="clr-namespace:MyAppNamespace.Properties"』を追加
- 連動させたい場所に『{Binding Source={x:Static properties:Settings.Default}, Path=SaveDate}』を記入。
以上。Modeも使える。TwoWayを設定することで、双方向に変更することも可能。
ちゃんと連動させる型は合わせてね。
これを使って、つぎ開いたときのウインドウサイズや位置などを学習させておくと便利。
保存するときは、忘れずにソースコードに以下の一文を記入する必要がある。
Properties.Settings.Default.Save();
Bindingの機能を拡張する
すてきな拡張機能がNuGetからインストールできるよ。
『CalcBinding』というやつ。
以下がGitHub。
https://github.com/Alex141/CalcBinding
計算できたり代数操作できたりboolを反転したりとかできるようになるみたい。
って勧めておきながら、私もいまのところboolを反転させる使い方くらいしかわかってない……。
英語読むのめんどくさい……気が向いたら、そのうち翻訳するよ。
boolを反転
以下はboolを反転させる方法。チェックボックスとか使うときに便利。
とくにWPFのMenuItemはラジオボタンみたいな動作ができないので……。
たとえば、MenuItemの『項目1』をチェックしたとき、『項目2』のチェックが自動的に外れてかつチェックされているほうのメニューは押せないようにしたい。チェックされていない側を押したときにチェックがついて反対側が外れるみたいなラジオボタンチックな動作やらせたい。みたいなときに、以下なかんじ。
まずNuGetからインストールして、そのあとWPFの<Windows>内に以下を書き足す。
xmlns:c="clr-namespace:CalcBinding;assembly=CalcBinding"
それから、該当するMenuItemを以下のようなかんじに。
<MenuItem x:Name="item1" Header="項目1" IsCheckable="True"
IsHitTestVisible="{c:Binding ElementName=item2,Path=!IsHitTestVisible,Mode=TwoWay}"
IsChecked="{c:Binding ElementName=item2,Path=!IsChecked,Mode=TwoWay}"/>
<MenuItem x:Name="item2" Header="項目2" IsCheckable="True" IsHitTestVisible="True" IsChecked="false"/>
こんなかんじで、Pathの頭に!をつけたらboolが反転するみたい。
ちなみに、
IsCheckable が、MenuItemにチェック機能を付けるかどうかのbool。trueで付ける。
IsChecked が、チェックが付いているかどうかのbool。trueでチェックが付く。
IsHitTestVisible が、コンテンツをクリックやタップすることができるかどうかのbool。trueでできる。
コメント
最新を表示する
>> 返信元
> 以下のようにすれば、false時にHiddenにすることもできる。
> Visibility="{c:Binding IsVisible, FalseToVisibility=Hidden}"
ありがとう。助かりました!
中国系ぽい情報サイトはガセやな。うまくいかなかった。
https://tutorialmore.com/questions-2021642.htm
CalcBindingだけど、bool → Visibility コンバータも兼ねてるよ(^^)
Visibility="{c:Binding IsVisible}"
とか。
以下のようにすれば、false時にHiddenにすることもできる。
Visibility="{c:Binding IsVisible, FalseToVisibility=Hidden}"
数値プロパティ同士の演算とかもできる。
<TextBlock Text="{c:Binding Width * Height}" />
NG表示方式
NGID一覧