2010-03-01 18 views
9

Tôi có một TextBox được liên kết với thuộc tính của đối tượng thực hiện IDataErrorInfo. Tôi thiết lập số Validation.ErrorTemplate của số TextBox và hoạt động tốt. Vấn đề là tôi có trên TabControl và mẫu xác thực không hiển thị nữa nếu tôi thay đổi tab sang tab khác và sau đó quay lại tab ban đầu (trong đó TextBox). Có vẻ như nó đã được xác nhận (như giá trị là chính xác), nhưng thực sự nó không phải là.Sự cố với xác thực WPF (IDataErrorInfo) và tab lấy nét

Đây là đối tượng IDataErrorInfo - lưu ý rằng một giá trị "đúng" là một chuỗi với chiều dài 2:

public class Presenter : IDataErrorInfo 
{ 
    public Presenter() 
    { 
     this.Property = String.Empty; 
    } 

    public string Property { get; set; } 

    public string Error { get { return null; } } 

    public string this[string columnName] 
    { 
     get 
     { 
      if (columnName == "Property") 
      { 
       if (this.Property.Length == 2) 
        return null; 
       else 
        return "Invalid property length!"; 
      } 
      else return null; 
     } 
    } 
} 

và đây là XAML:

<TabControl > 
    <TabItem Header="tabItem1" Name="tabItem1" GotFocus="tabItem1_GotFocus"> 
     <Grid> 
      <TextBox Width="100" Height="20" x:Name="txtField"> 
       <TextBox.Style> 
        <Style TargetType="{x:Type TextBox}"> 
         <Setter Property="Validation.ErrorTemplate"> 
          <Setter.Value> 
          <ControlTemplate> 
           <Grid> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="Auto"/> 
             <ColumnDefinition Width="16"/> 
            </Grid.ColumnDefinitions> 
            <AdornedElementPlaceholder Grid.Column="0"/> 
            <Image Source="bullets16.png" Grid.Column="1" ToolTip="{Binding CurrentItem.ErrorContent, Mode=OneWay}"> 
            </Image> 
           </Grid> 
          </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </TextBox.Style> 
       <TextBox.Text> 
        <Binding Path="Property" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True"> 
        </Binding> 
       </TextBox.Text> 
      </TextBox> 
     </Grid> 
    </TabItem> 
    <TabItem Header="tabItem2" Name="tabItem2" > 
     <Grid /> 
    </TabItem> 
</TabControl> 

Bất kỳ ý tưởng về những gì Tôi đang làm sai?

Trả lời

26

Các mục trong tab có xu hướng lộn xộn với adorners (mặc dù tôi không biết tại sao, tôi đã trải qua nó).

Tôi có thể tái tạo sự cố của bạn.

Giải quyết nó bằng cách gói nội dung của TabItem bằng AdornerDecorator.

Vì vậy:

<TabControl > 
    <TabItem Header="tabItem1" Name="tabItem1" GotFocus="tabItem1_GotFocus"> 

     <AdornerDecorator> 

      <Grid> 
      .... 
      </Grid> 

     </AdornerDecorator> 

    </TabItem> 
    ... 
</TabControl> 
+2

Đây cũng là một vấn đề với các nội dung của 'Expander', và cùng một giải pháp được áp dụng. –

+1

Bài đăng blog có liên quan - [Lỗi xác thực WPF biến mất bên trong TabControl khi chuyển đổi tabItems] (http://karlshifflett.wordpress.com/2008/02/19/wpf-validation-errors-disappear-inside-tabcontrol-when-switching- tabitems /) – akjoshi

+2

Không phải là giải pháp hoàn chỉnh. Xác thực ban đầu chỉ hoạt động đối với mục tab được chọn đầu tiên, phần còn lại của chúng sẽ không tự động xác thực khi bạn chuyển sang chúng. Tôi phát hiện ra rằng bằng cách đặt thủ công DataContext trong mã phía sau trong chúng tại OnLoad giải quyết vấn đề này là tốt nhưng nó xấu xí. Tôi vẫn đang tìm kiếm giải pháp ... – MoonStom

0

tôi có vấn đề với chỉ đầu tiên (tập trung) tab có phong cách và chỉ cái đó tồn tại sau khi thay đổi. Đây là giải pháp tôi đã kết thúc với (không AdornerDecorator)

<Style TargetType="{x:Type FrameworkElement}" x:Key="ValidatingControl"> 
<Style.Triggers> 
    <MultiTrigger> 
     <MultiTrigger.Conditions> 
      <Condition Property="Validation.HasError" Value="True" /> 
      <Condition Property="IsVisible" Value="True" /> 
     </MultiTrigger.Conditions> 
     <Setter Property="Validation.ErrorTemplate"> 
      <Setter.Value> 
       <ControlTemplate> 
        <DockPanel LastChildFill="True"> 
         <Border BorderBrush="Red" BorderThickness="1"> 
          <AdornedElementPlaceholder Name="controlWithError"/> 
         </Border> 
        </DockPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="ToolTip" 
     Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}" /> 
    </MultiTrigger> 
</Style.Triggers> 

Dựa trên bài viết này: http://techqa.info/programming/question/1369643/wpf-error-styles-only-being-rendered-properly-on-visible-tab-of-a-tab-control

Các vấn đề liên quan