1

2つのテキストボックスにエラーがない場合にのみボタンのIsEnabledをtrueにしたい(この場合、両方を数値にしたい)

テキストボックスをNotifyOnValidationError=Trueに設定しようとしましたが、これにより、コンテナコントロールにバブルアップする例外が発生すると考えました。次に、そのコントロールに属するValidation.HasError添付プロパティに基づいて、ボタンのIsEnabledをtrueに設定します。

次のことを試しましたが(フォーマットコードを削除)、機能しません(アプリケーションを最初に起動したときにボタンが有効になっていて、テキストボックスが空です-null許容の小数にバインドされています)

<WrapPanel>
    <TextBox x:Name="txtDeltaMin"Text="{Binding Path=DeltaMinFilter, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}"></TextBox>
    <TextBox x:Name="txtDeltaMax" Text="{Binding Path=DeltaMaxFilter, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}"></TextBox>
    <Button x:Name="btnUpdateFilter" Click="btnUpdateFilter_Click" IsEnabled="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type WrapPanel}}, Path=(Validation.HasError)}">Filter</Button>
</WrapPanel>
4

2 に答える 2

3

MultiBindingを使用できます。次のようになります。

<TextBox Text="{Binding Path=DeltaMinFilter, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" />
<TextBox x:Name="txtDeltaMax" Text="{Binding Path=DeltaMaxFilter, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" />
<Button x:Name="btnUpdateFilter" Click="btnUpdateFilter_Click" Content="Filter">
    <Button.IsEnabled>
        <MultiBinding Converter="{StaticResource IsEnabledConverter}">
            <Binding ElementName="txtDeltaMin" Path="Validation.HasError" />
            <Binding ElementName="txtDeltaMax" Path="Validation.HasError" />
        </MultiBinding>
    </Button.IsEnabled> 
</Button>

次に、IMultiValueConverterを実装してIsEnabledConverterクラスを作成し、それをリソースとして追加する必要があります。

public class IsEnabledConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        foreach (var isValid in values)
            if (isValid as bool? == false) 
                return false;
        return true;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
于 2012-08-22T04:33:34.177 に答える
1

このMSDN 記事で説明されているように CommandBinding を作成し、 CanExecute を設定してCanExecuteHandlerを使用してボタンを有効/無効にすることもできます。

2番目のリンクから:

通常、MenuItem などのコマンド ソースは、RoutedCommand の CanExecute メソッドを呼び出して、現在のコマンド ターゲットでコマンドを実行できるかどうかを判断します。CanExecute がイベント ハンドラーから false に設定されている場合、コマンド ソースはそれ自体を無効にします。たとえば、MenuItem がコマンドのコマンド ソースとして機能していて、コマンドが現在のコマンド ターゲットで実行できない場合、MenuItem はグレー表示になります。

于 2012-08-22T04:45:18.873 に答える