5

コンテンツを検証するユーザーコントロールがあります。

IDataErrorInfo を使用して入力を検証しています (.Net 3.5 を使用する必要があります)。

私はこのチュートリアルに従っています: http://japikse.blogspot.ch/2009/07/idataerrorinfo-error-templates-and-wpf.html

これは、次のスタイルを使用していることを意味します。

<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
        <Setter Property="Background" Value="Pink"/>
        <Setter Property="Foreground" Value="Black"/>
    </Trigger>
</Style.Triggers>
<Setter Property="Validation.ErrorTemplate">
    <Setter.Value>
        <ControlTemplate>
            <DockPanel LastChildFill="True" 
               ToolTip="{Binding ElementName=controlWithError,Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
                <TextBlock DockPanel.Dock="Right" 
                   Foreground="Red"
                   FontSize="14pt" 
                   Margin="-15,0,0,0" FontWeight="Bold">*
                </TextBlock>
                <Border BorderBrush="Red" BorderThickness="1">
                <AdornedElementPlaceholder Name="controlWithError" />
                </Border>
            </DockPanel>
        </ControlTemplate>
    </Setter.Value>
</Setter>

問題は、場合によってはフォームを非表示にする必要があることです (要素が選択されていない場合) が、表示されたフォームにエラーがなく、フォーム (グリッド) を折りたたむ場合、UserControls のテキストボックス(null値を受け入れないため無効です)赤い枠とアスタリスクを取得しました:

ここに画像の説明を入力

非表示でない場合の同じフォーム: ここに画像の説明を入力 注: 表示されるのは ErrorTemplate のコンテンツのみであり、トリガーのコンテンツ (背景がピンク、前景が黒) は適用されません。

したがって、このスタイルには何か問題があると思いますが、その理由を理解できるほど WPF スタイルに精通していません。

もう1つの奇妙なこと:これと同じ検証を行ったテキストボックス(ユーザーコントロールのテキストボックスではない)がある場合、それらは正しく非表示になります。

編集 私は、最初に、このトピックに非常に役立ついくつかの追加のものを見つけました: コントロールを非表示にするときに検証装飾を非 表示にするこれで、次のことを行いました:ユーザーコントロールの可視性を隠し要素の可視性にバインドし、ユーザーコントロールで、私はテキスト ボックスの可視性をユーザー コントロールの可視性にバインドし、(最後に) スタイル トリガーを追加します。

<Style TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="Background" Value="Pink"/>
                <Setter Property="Foreground" Value="Black"/>
            </Trigger>
            <Trigger Property="Visibility" Value="Visible">
                <Setter Property="Validation.ErrorTemplate">
                    <Setter.Value>
                        <ControlTemplate>
                            <DockPanel LastChildFill="True" ToolTip="{Binding ElementName=controlWithError,Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" >
                                <TextBlock DockPanel.Dock="Right" Foreground="Red" FontSize="14pt" Margin="-15,0,0,0" FontWeight="Bold">*</TextBlock>
                                <Border BorderBrush="Red" BorderThickness="1">
                                    <AdornedElementPlaceholder Name="controlWithError" />
                                </Border>
                            </DockPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
</Style>

それはほとんど動作します!, 残っているのはどこからともなく小さな赤い点だけです. ここに画像の説明を入力

どこから来たのですか?

4

1 に答える 1

2

私は回避策を見つけました、それはおそらく最良の方法ではありません(あなたがより良い方法を持っているなら、私に教えてください!)。

したがって、最初に、ユーザーコントロールを使用するときに、その可視性を非表示にするユーザーコントロールにバインドします。

<userContols:BrowseFileControl  Visibility="{Binding ElementName=uxFormGrid, Path=Visibility}"/>

次に、IDataErrorInfo method(public string this[string columnName])で、現在のコントロールが表示されている場合にのみエラーを返します。

    public string this[string columnName]
    {
        get
        {
            String result=null;
            if (Visibility == Visibility.Visible)
            {
                if (columnName == "FilePath")
                {
                    if (String.IsNullOrEmpty(FilePath))
                    {
                        if (!CanBeEmpty)
                        {
                            result = "Mandatory field";
                        }
                    }
                    else if (!IsValidFilePath(FilePath))
                    {
                        result = "Malformed path";
                    }
                }
            }
            return result;
        }
    }

スタイルに取り組みたいのですが、赤いマークを完全に取り除く方法が見つかりませんでした。

于 2012-11-29T14:56:36.993 に答える