2012-10-28 61 views
1

我創建了一個用戶控件 - 一個標記爲TextBox,除了驗證模板以外,它工作得很好。當出現錯誤時,驗證控件模板將顯示出來,但它會填充整個空間,包括標籤。我只希望它和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> 
+0

如果爲DockPanel設置Width =「{Binding ElementName = tbx,Path = ActualWidth}」,會發生什麼情況? – Bijan

回答

0

感謝您的迴應,它幫助我找出問題所在。爲此,我投票表示它有用。

我所做的是以編程方式查詢TextBoxChangedEvent中的UserControl驗證錯誤,並手動爲TextBox手動設置驗證錯誤(http://wpftutorial.net/ValidationErrorByCode.html)。

1

之所以出現這種情況是,你實現你的觀點IDataErrorInfo,而不是你的用戶控件。這會導致默認 WPF紅色邊框出現在整個用戶控件中。

要讓您的定義的錯誤模板出現,您需要在usercontrol中實現IDataErrorInfo,並將ValidatesOnDataErrors=True添加到綁定表達式中。

如果你想保持IDataErrorInfo邏輯視圖,而不是在你的用戶控件(這是相當合理的),你需要定義一個驗證模板,在視圖中的用戶控件:

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

爲了讓它只顯示TextBox的邊框,可以使用將整個usercontrol的寬度作爲參數並返回文本框寬度的轉換器來播放邊框的寬度;可能是這樣的:

<Border BorderBrush="Red" BorderThickness="1" Width="{Binding ElementName=ph, Path=ActualWidth, Converter={StaticResource myConverter}}"> 
    <AdornedElementPlaceholder Name="ph" /> 
</Border>