2016-07-26 2 views
0

У меня есть объект ошибки:Различные шаблоны для INotifyDataErrorInfo

/// <summary> 
/// Represent error in wizard control child. 
/// </summary> 
public sealed class ErrorContainer 
{ 
    /// <summary> 
    /// Ctor. 
    /// </summary> 
    /// <param name="kind"></param> 
    /// <param name="message"></param> 
    public ErrorContainer(ErrorKind kind, string message) 
    { 
     Contract.Requires(!string.IsNullOrEmpty(message)); 

     Kind = kind; 
     Message = message; 
    } 

    /// <summary> 
    /// Kind of error. 
    /// </summary> 
    public ErrorKind Kind { get; private set; } 

    /// <summary> 
    /// Text to display. 
    /// </summary> 
    public string Message { get; private set; } 

    public override string ToString() 
    { 
     return Message; 
    } 
} 

/// <summary> 
/// Kind of error. 
/// </summary> 
public enum ErrorKind 
{ 
    /// <summary> 
    /// Prevents telegram send. 
    /// </summary> 
    Critical = 0, 

    /// <summary> 
    /// Only display message. 
    /// </summary> 
    Warning = 1 
} 

я использую INotifyDataErrorInfo и пользовательский стиль для моего текстового поля. Я возвращаю коллекцию ErrorContainer как ошибки INotifyDataErrorInfo. Я хочу показать сообщение об ошибке, только если ErrorKind - Critical. Вот как я пытаюсь сделать это:

<Style x:Key="TextboxWithAdvancedValidationHorizontal" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"> 
    <Style.Triggers> 
    <DataTrigger Binding="{Binding CurrentItem.ErrorContent.Kind}" Value="{x:Static kn01:ErrorKind.Critical}"> 
     <Setter Property="Validation.ErrorTemplate"> 
     <Setter.Value> 
      <ControlTemplate> 
      <StackPanel Orientation="Horizontal" SnapsToDevicePixels="True"> 
       <Border BorderBrush="Salmon" Background="#11FF0000" IsHitTestVisible="False"> 
       <AdornedElementPlaceholder /> 
       </Border> 
       <StackPanel Orientation="Horizontal"> 
       <Polygon VerticalAlignment="Center" Points="0,4 4,0 4,8" Fill="Salmon" Stretch="Fill" Stroke="Salmon" StrokeThickness="2" /> 
       <Border Background="Salmon" Padding="4" Margin="-1,0,0,0"> 
        <TextBlock HorizontalAlignment="Center" Foreground="White" FontWeight="Bold" Margin="2,-1,0,1" Text="{Binding CurrentItem.ErrorContent}" /> 
       </Border> 
       </StackPanel> 
      </StackPanel> 
      </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    </DataTrigger> 
    </Style.Triggers> 
</Style> 

Однако он не работает на всех, и шаблон ошибки использования по умолчанию.

ответ

0

Вы пробовали отлаживать его с помощью контрольных точек, чтобы проверить свои привязки? Кроме того, я думаю, что вы неправильно настроили свой стиль. Вот еще один ответ, который может помочь: https://stackoverflow.com/a/4133971/6563936

+0

Я уверен, что я нацелен на свой стиль неправильно, но я не понимаю, как он должен его нацеливать. –

+0

Вы добавили Style = "{StaticResource TextboxWithAdvancedValidationHorizontal}" в текстовое поле, которое вы хотите отобразить, так? –

+0

уверен, что сделал. Проблема заключается не в том, как я связываю стиль управления, но как я связываю ошибки INotifyDataErrorInfo во внутреннем триггере. –

2

Не ставьте Validation.ErrorTemplate шаблон внутри триггера.

Validation.ErrorTemplate должен быть установлен до возникновения ошибки.

Если вам нужны разные шаблоны ошибок, используйте триггеры внутри ErrorTemplate. Кроме того, вы можете использовать ContentPresenter с ContentTemplateSelector.

<Style x:Key="TextboxWithAdvancedValidationHorizontal" TargetType="TextBox"> 
    <Setter Property="Validation.ErrorTemplate"> 
    <Setter.Value> 

      <ControlTemplate> 
      <StackPanel Orientation="Horizontal" SnapsToDevicePixels="True"> 
       <Border BorderBrush="Salmon" Background="#11FF0000" IsHitTestVisible="False"> 
       <AdornedElementPlaceholder /> 
       </Border> 
      </StackPanel> 

      <ControlTemplate.Triggers> 
       <DataTrigger Binding="..."> 
       <!-- add you custom UI logic here --> 
       </DataTrigger> 
      </ControlTemplate.Triggers> 
      </ControlTemplate> 

    </Setter.Value> 
    </Setter> 
</Style>