2010-10-19 4 views
4

У меня нет ошибок привязки, и этот код работает в другом месте. Я еще не выяснил, что я делаю теперь по-разному с кодом, где он работает, и это не так уж много кода.Шаблон ошибки WPF не отображается

В UserControl.Resource:

<Style TargetType="TextBox"> 
    <Setter Property="BorderBrush" Value="DarkBlue"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="Margin" Value="0,1,0,1"/> 
    <Setter Property="Validation.ErrorTemplate"> 
    <Setter.Value> 
     <ControlTemplate> 
     <StackPanel Orientation="Horizontal"> 
      <AdornedElementPlaceholder/> 
      <Grid Margin="2,0,0,0"> 
      <Ellipse Width="20" Height="20" Fill="Red"/> 
      <TextBlock Foreground="White" Text="X" FontWeight="Bold" 
         HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      </Grid> 
     </StackPanel> 
     </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> 

Ниже в Xaml тоже:

<TextBlock Height="23" HorizontalAlignment="Left" Margin="22,90,0,0" 
      Text="Keywords" VerticalAlignment="Top"/> 
<TextBox Height="23" HorizontalAlignment="Left" Margin="22,108,0,0" 
     VerticalAlignment="Top" Width="244"> 
    <Binding Path="Tags" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"> 
    <Binding.ValidationRules> 
     <DataErrorValidationRule ValidatesOnTargetUpdated="False"/> 
    </Binding.ValidationRules> 
    </Binding> 
</TextBox> 

Кнопка SAVE в моем ViewModel активируется только тогда, когда Model.Tags недвижимость больше вход 10 символов от пользователя. При активации/отключении кнопки срабатывает при вводе 10,11, а затем обратно 8 символов. Все изменения свойств уволены.

Модель:

namespace TBM.Model 
{ 
    public class Document : EntityBase , IDataErrorInfo 
    { 
     public int Id { get; set; } 
     public string DocumentName { get; set; } 
     public string Tags { get; set; } 
     public byte[] DocumentData { get; set; } 
     public int PeriodId { get; set; } 

     string IDataErrorInfo.Error { get { return null; } } 

     string IDataErrorInfo.this[string propertyName] 
     { 
      get { return this.GetValidationError(propertyName); } 
     } 

     public bool IsValid 
     { 
      get 
      { 
       foreach (string property in ValidatedProperties) 
        if (GetValidationError(property) != null) 
         return false; 

       return true; 
      } 
     } 

     static readonly string[] ValidatedProperties = { "Tags", }; 

     private string GetValidationError(string propertyName) 
     { 
      if (Array.IndexOf(ValidatedProperties, propertyName) < 0) 
       return null; 

      string error = null; 

      switch (propertyName) 
      {    
       case "Tags": error = this.IsTagsEmpty(Tags); break; 

       default: 
        Debug.Fail("Unexpected property being validated on Document: " + propertyName); 
        break; 
      } 
      return error; 
     } 

     private string IsTagsEmpty(string value) 
     { 
      if (value != null && value.Trim().Length >= 10) 
       return null; 
      else 
       return "The keywords must have at least 10 chars!";    
     } 
    } 
} 

ViewModel:

public RelayCommand SaveDocumentCommand 
{ 
    get { return _saveDocumentCommand ?? (_saveDocumentCommand = 
     new RelayCommand(() => SaveDocument(),() => CanSaveDocument())); } 
    } 

    private bool CanSaveDocument() 
    { 
     return _document.IsValid; 
    } 
//... 

Что не работает это ErrorTemplate с красным эллипсом не отображается на всех?

UPDATE: Именно этот код работает в проекте TEST. Но в моем продуктивном проекте он не находит Ресурс ??? Почему это так?

<TextBlock Height="23" HorizontalAlignment="Left" Margin="22,89,0,0" 
      Text="Keywords" VerticalAlignment="Top"/> 
    <TextBox Style="{StaticResource bla}" Height="23" HorizontalAlignment="Left" 
      Margin="22,109,0,0" VerticalAlignment="Top" Width="244"> 
    <Binding Path="Tags" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"> 
     <Binding.ValidationRules> 
     <DataErrorValidationRule ValidatesOnTargetUpdated="False" 
           ValidationStep="UpdatedValue"/> 
     </Binding.ValidationRules> 
    </Binding> 
    </TextBox> 

<UserControl.Resources> 
    <Style x:Name="bla" TargetType="TextBox"> 
    <Setter Property="BorderBrush" Value="DarkBlue"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="Margin" Value="0,1,0,1"/> 
    <Setter Property="Validation.ErrorTemplate"> 
     <Setter.Value> 
     <ControlTemplate> 
      <StackPanel Orientation="Horizontal">       
      <AdornedElementPlaceholder/> 
      <Grid Margin="2,0,0,0"> 
       <Ellipse Width="20" Height="20" Fill="Red"/> 
       <TextBlock Foreground="White" Text="X" FontWeight="Bold" 
         HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      </Grid> 
      </StackPanel> 
     </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> 
</UserControl.Resources> 

ответ

0

У меня была аналогичная проблема с этим, как оказалось, не быть шаблоном, но проверка не возвращал то, что я ожидал.

+0

Валидация всегда возвращает ожидаемое значение. Поэтому кнопка включена/отключена. – Elisabeth

+0

Я поместил ваш код в пользовательский элемент управления, а свойство IsEnabled привязано к IsValid, и все это отлично работало. Вы пытались запустить snoop над пользовательским интерфейсом, чтобы убедиться, что у вас нет чего-то, перекрывающего эллипс. Может ли быть еще один стиль TextBox? Попробуйте взять код из своего проекта и в тестовое приложение и убедитесь, что он работает там. – benPearce

+0

Да, я все еще хотел протестировать его в дополнительном проекте. Хотя у меня еще есть около 30 пикселей на левой стороне, это не видно ... черт побери, возможно, маржа ... проверьте это позже. Ooooh snoop не нравится, как будто он часто работает не так, как ожидалось ... Afair нет другого текстового текста неявного стиля или явного стиля. Я позволил вам узнать латнеры ... – Elisabeth

0

ViewModel должен реализовать IDataErrorInfo, а не модель. ViewModel привязывается к вашему представлению как к DataContext, а не к модели, поэтому реализует интерфейс в ViewModel и привязывается к соответствующим свойствам в XAML.

+3

это спорно ... Джош Смит MVVM статья ставит проверку в модели и даже более сохранение модели и ее проверки вместе предпочтительна при экспорте своих моделей с помощью услуг, но в моем случае да изменится, что, вероятно. Хотя я должен сказать, что ваше решение не имеет ничего общего с моей проблемой ;-) вы должны были сделать это. – Elisabeth

11

У меня была аналогичная проблема. Бороться с ним часами, чтобы понять, что что-то не так с слоем адэрера.

То, что я сделал, это положить меня с элементами управления внутри. И все. По какой-то причине этот слой декоратора иногда уходит. Это верно для TabControl (но в моем случае это была другая причина).

Так оно и должно выглядеть следующим образом

<AdornerDecorator> 
    <Grid> 
    <TextBox .../> 
    </Grid> 
</AdornerDecorator> 

Надеется, что это помогает!

+2

Это именно то, что мне нужно. У меня возникли проблемы с шаблоном ошибки, отображаемым при переключении между вкладками в элементе управления вкладкой. Когда я добавил AdornerDecorator, он постоянно показывался каждый раз, когда я переключался на вкладку. Благодаря! – Geo242

+0

Спасибо, это была моя проблема. Этот ответ дает дополнительную информацию [link] http://stackoverflow.com/a/2597006/1477247 – Daniel

+0

Спасибо - моя проблема была вариацией на тему - в том, что мой шаблон ошибки НЕ показывался вообще, когда я переключался между встроенные пользовательские элементы управления внутри окна. Исправлено добавление «AdornerDecorator» на верхний уровень встроенных пользовательских элементов управления. – Wolfshead

Смежные вопросы