21

以下に示すように、IDataErrorInfo インターフェイスとスタイルを使用して、WPF でテキスト ボックスを検証する標準的な方法と思われるものを採用しました。ただし、ページが無効になったときに [保存] ボタンを無効にするにはどうすればよいですか? これはトリガーを介して何らかの方法で行われますか?

Default Public ReadOnly Property Item(ByVal propertyName As String) As String Implements IDataErrorInfo.Item
    Get
        Dim valid As Boolean = True
        If propertyName = "IncidentCategory" Then
            valid = True
            If Len(IncidentCategory) = 0 Then
                valid = False
            End If
            If Not valid Then
                Return "Incident category is required"
            End If
        End If

        Return Nothing

    End Get
End Property

<Style TargetType="{x:Type TextBox}">
    <Setter Property="Margin" Value="3" />
    <Setter Property="Height" Value="23" />
    <Setter Property="HorizontalAlignment" Value="Left" />
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <DockPanel LastChildFill="True">
                    <Border BorderBrush="Red" BorderThickness="1">
                        <AdornedElementPlaceholder Name="MyAdorner" />
                    </Border>
                </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip"  Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
        </Trigger>
    </Style.Triggers>
</Style>
4

2 に答える 2

40

いくつかのこと:

ApplicationCommands.Saveまず、保存ボタンの処理を実装するために RoutedCommand を使用することをお勧めします。

WPF Command モデルをチェックアウトしていない場合は、ここでスクープを取得できます。

<Button Content="Save" Command="Save">

ここで、機能を実装するために、コマンド バインディングを Window/UserControl または Button 自体に追加できます。

    <Button.CommandBindings>
        <CommandBinding Command="Save" 
                        Executed="Save_Executed" CanExecute="Save_CanExecute"/>
    </Button.CommandBindings>
</Button>

これらをコード ビハインドで実装します。

private void Save_Executed(object sender, ExecutedRoutedEventArgs e)
{
}

private void Save_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
}

では、テキスト ボックスのバインドの有効性に基づいてSave_CanExecute設定します。e.CanExecute

MVVM (Model-View-ViewModel) デザイン パターンを使用して実装する場合は、CommandSinkBindingに関する Josh Smith の投稿を確認してください。

TextBox最後の注意: の値が変更されるとすぐに有効化/無効化を更新する場合はUpdateSourceTrigger="PropertyChanged"、 のバインディングで設定しTextBoxます。

編集: コントロール内のすべてのバインディングに基づいて検証/無効化する場合は、いくつかの提案があります。

1) すでに実装していますIDataErrorInfoIDataErrorInfo.Errorバインド先のすべてのプロパティに対して無効な文字列を返すようにプロパティを実装してみてください。これは、コントロール全体が単一のデータ オブジェクトにバインドされている場合にのみ機能します。設定e.CanExecute = string.IsNullOrEmpty(data.Error);

2) リフレクションを使用して、関連するコントロールの public static DependencyProperties をすべて取得します。次にBindingOperations.GetBindingExpression(relevantControl, DependencyProperty)、検証をテストできるように、各プロパティでループを呼び出します。

3) コンストラクターで、ネストされたコントロールのバインドされたすべてのプロパティのコレクションを手動で作成します。CanExecute では、このコレクションを反復処理し、使用して式を取得してから調べることで、各DependencyObject/DepencyPropertyの組み合わせを検証します。BindingOperation.GetBindingExpression()BindingExpression.HasError

于 2009-04-16T19:22:43.153 に答える