本日は、WPFの記事です。
ダイアログを作成する時、
いろいろなコントロールの状態を見て、OKボタンの有効/無効状態を切り替えたい場合、どのような手法を使いますか?
例えばこのようなダイアログが、あったとして
入力エラーのテキストボックスが、1つ以上存在した時、OKボタンを無効したいといった場合です。
MultiBindingを使用すれば、複数のコントロールの状態を見て、OKボタンの状態を変化させることができます。
|
<Button x:Name="button" Content="OK" HorizontalAlignment="Left" Margin="26,125,0,0" VerticalAlignment="Top" Width="50"> <Button.IsEnabled> <MultiBinding Converter="{StaticResource ConvertNegativeIfTrueExist}" UpdateSourceTrigger="PropertyChanged"> <Binding Path="(Validation.HasError)" ElementName="textBox1" /> <Binding Path="(Validation.HasError)" ElementName="textBox2" /> <Binding Path="(Validation.HasError)" ElementName="textBox3" /> </MultiBinding> </Button.IsEnabled> </Button> |
Path=”(Validation.HasError)” ElementName=”textBox1″でtextBox1のエラー状態をみています。textBox2とtextBox3の状態も合わせてみることができます。
MultiBindingでは、複数の状態を使って、どのように反映させるかをConverterを使って定義してあげないといけないです。
Converter=”{StaticResource ConvertNegativeIfTrueExist}” の部分です。
ConvertNegativeIfTrueExistの実装です。
IMultiValueConverterを基本クラスとしてコンバータ定義してください。
|
public class ConvertNegativeIfTrueExist : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (values == null) { return true; } return (!Array.Exists(values, s => ((bool)s) == true)); } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { return value.ToString().Split(':'); } } |
今回の例では、エラー状態が存在する、つまり一つでもtrueが存在すれば、無効にしたので、falseを返すようにします。一つもなければ、trueを返します。
コンバータ使用の際はxamlの先頭で次のように書いてください。
|
<Window.Resources> <local:ConvertNegativeIfTrueExist x:Key="ConvertNegativeIfTrueExist" /> </Window.Resources> |
以上
——-
android無料アプリ
タイマー&四つ葉のクローバー探し
https://play.google.com/store/apps/details?id=com.tuffyz.clovertimer