1

UserControlを作成しました-TextBox検証テンプレートを除いて、かなりうまく機能しているLabeledです。エラーが発生すると、検証コントロールテンプレートが表示されますが、ラベルを含むスペース全体がいっぱいになります。と同じくらいの大きさにしたいだけですTextBox。これを修正する方法は?

xamlは次のとおりです。

<UserControl x:Class="Infrastructure.CustomControls.LabelTextBox"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Name="LTB">

    <Grid HorizontalAlignment="{Binding}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <TextBlock x:Name="tbl" 
                   FontFamily="{Binding}" 
                   FontSize="{Binding}" 
                   Text="{Binding ElementName=LTB, Path=LabelText}" 
                   Height="{Binding ElementName=LTB, Path=LabelHeight}" 
                   Width="{Binding ElementName=LTB, Path=LabelWidth}" 
                   VerticalAlignment="Center"/>
        <TextBox x:Name="tbx" 
                 Grid.Column="1" 
                 FontFamily="{Binding}" 
                 FontSize="{Binding}" 
                 IsReadOnly="{Binding ElementName=LTB, Path=IsReadOnly}" 
                 MaxLength="{Binding ElementName=LTB, Path=TextMaxLength}" 
                 Text="{Binding ElementName=LTB, Path=Text}" 
                 Height="{Binding ElementName=LTB, Path=TextHeight}"
                 Width="{Binding ElementName=LTB, Path=TextWidth}" 
                 VerticalAlignment="Center">
            <Validation.ErrorTemplate>
                <ControlTemplate>
                    <DockPanel LastChildFill="True" 
                               ToolTip="{Binding ElementName=aep, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
                        <TextBlock DockPanel.Dock="Right" 
                                   Foreground="Red" 
                                   FontSize="14pt" Text="*" 
                                   Margin="-15,0,0,0" 
                                   FontWeight="Bold"/>
                        <Border BorderBrush="Red" BorderThickness="1">
                            <AdornedElementPlaceholder Name="aep"/>
                        </Border>
                    </DockPanel>
                </ControlTemplate>
            </Validation.ErrorTemplate>
        </TextBox>
    </Grid>
</UserControl>
4

2 に答える 2

1

これが発生する理由はIDataErrorInfo、UserControl ではなくビューに実装しているためです。これにより、デフォルトのWPF の赤い境界線がユーザー コントロール全体に表示されます。

定義したエラー テンプレートを表示するには、ユーザー コントロールに実装し、バインディング式にIDataErrorInfo追加する必要があります。ValidatesOnDataErrors=True

ロジックを UserControl ではなくビューに保持したい場合IDataErrorInfo(これはかなり合理的です)、ビューでユーザー コントロールの検証テンプレートを定義する必要があります。

<Window>
    <local:UserControl>
        <Validation.ErrorTemplate>
            <ControlTemplate>
                ...
            </ControlTemplate>
        </Validation.ErrorTemplate>
    </local:UserControl>
</Window>

TextBox の境界線のみを表示するには、ユーザー コントロールの幅全体をパラメーターとして受け取り、テキスト ボックスの幅を返すコンバーターを使用して、境界線の幅で遊ぶことができます。おそらく次のようなものです:

<Border BorderBrush="Red" BorderThickness="1" Width="{Binding ElementName=ph, Path=ActualWidth, Converter={StaticResource myConverter}}">
    <AdornedElementPlaceholder Name="ph" />
</Border>
于 2012-10-28T21:51:57.747 に答える
0

回答ありがとうございます。問題がどこにあるかを理解するのに役立ちました。そしてそのために、私はそれを有用であると投票します。

私がしたことは、エラーの UserControl 検証をプログラムでTextBoxChangedEventクエリTextBox.

于 2012-10-31T16:14:33.880 に答える