2016-03-04 4 views
2

Я внедрил IDataErrorInfo в пользовательские элементы управления ViewModel. Все работает отлично (граница рисуется красным цветом, всплывающая подсказка с ошибкой затирается), но мне было интересно, есть ли способ иметь два разных Validation.ErrorTemplate с для ошибок и предупреждений.IDateErrorInfo Multi Validation.ErrorTemplate

Мой пользовательский элемент управления Style (с Validation.ErrorTemplate)

 <Style TargetType="{x:Type controls:CustomTextBoxNumeric}"> 
     <Setter Property="TextAlignment" Value="Right"/> 
     <Setter Property="Validation.ErrorTemplate"> 
      <Setter.Value> 
       <ControlTemplate> 
        <DockPanel LastChildFill="True"> 
         <Border BorderBrush="Red" BorderThickness="1"> 
          <AdornedElementPlaceholder /> 
         </Border> 
        </DockPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="true"> 
       <Setter Property="ToolTip" 
         Value="{Binding RelativeSource={RelativeSource Self}, 
         Path=(Validation.Errors).CurrentItem.ErrorContent}"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

Мой пользовательский элемент управления ViewModel (INotifyPropertyChanged реализован на базе ViewModel)

public class CustomTextBoxNumericViewModel : BaseComponentViewModel, IDataErrorInfo 
{ 
    private decimal? decimalValue; 
    private bool hasErrors; 
    private bool hasWarnings; 

    public CustomTextBoxNumericViewModel() 
    { 

    } 

    [DataMember(EmitDefaultValue = false)] 
    public decimal? DecimalValue 
    { 
     get { return this.decimalValue; } 
     set { this.decimalValue = value; this.Changed("DecimalValue"); this.Changed("HasErrors"); } 
    } 

    [DataMember(EmitDefaultValue = false)] 
    public bool HasErrors 
    { 
     get { return this.hasErrors; } 
     set { this.hasErrors = value; this.Changed("HasErrors"); this.Changed("DecimalValue"); } 
    } 

    [DataMember(EmitDefaultValue = false)] 
    public bool HasWarnings 
    { 
     get { return this.hasWarnings; } 
     set { this.hasWarnings = value; this.Changed("HasWarnings"); this.Changed("DecimalValue"); } 
    } 

    #region IDataErrorInfo Implementation 

    public string Error 
    { 
     get 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public string this[string propertyName] 
    { 
     get 
     { 
      if (propertyName == "DecimalValue") 
      { 
       if (HasErrors) 
       { 
        return this.ErrorsField; 
       } 
       if (HasWarnings) 
       { 
        return this.WarningsField; 
       } 
       if (DecimalValue < 0) 
       { 
        return "Must be greater than 0"; 
       } 
      } 
      return string.Empty; 
     } 
    } 

    #endregion 
} 
+0

Вы можете достичь его с помощью Style.Triggers –

ответ

1

мне удалось решить моя проблема с использованием ресурсов ControlTemplate.

Мой стиль изменен на:

<Style TargetType="{x:Type controls:CustomTextBoxNumeric}"> 
     <Setter Property="TextAlignment" Value="Right"/> 
     <Setter Property="Validation.ErrorTemplate"> 
      <Setter.Value> 
       <ControlTemplate> 
        <DockPanel LastChildFill="True"> 
         <Border BorderBrush="Red" BorderThickness="1"> 
          <AdornedElementPlaceholder /> 
         </Border> 
        </DockPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="true"> 
       <Setter Property="ToolTip" 
         Value="{Binding RelativeSource={RelativeSource Self}, 
         Path=(Validation.Errors).CurrentItem.ErrorContent}"/> 
      </Trigger> 
      <DataTrigger Binding="{Binding Path=ViewModel.HasWarnings, RelativeSource={RelativeSource Self}}" Value="True"> 
       <Setter Property="Validation.ErrorTemplate" Value="{DynamicResource EntypoWarningTemplate}" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=ViewModel.HasErrors, RelativeSource={RelativeSource Self}}" Value="True"> 
       <Setter Property="Validation.ErrorTemplate" Value="{DynamicResource EntypoErrorTemplate}" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

ControlTemplates:

 <ControlTemplate x:Key="MyErrorTemplate" TargetType="{x:Type Control}"> 
     <DockPanel LastChildFill="True"> 
      <Border BorderBrush="Red" BorderThickness="1"> 
       <AdornedElementPlaceholder /> 
      </Border> 
     </DockPanel> 
    </ControlTemplate> 

    <ControlTemplate x:Key="MyWarningTemplate" TargetType="{x:Type Control}"> 
     <DockPanel LastChildFill="True"> 
      <Border BorderBrush="Orange" BorderThickness="1"> 
       <AdornedElementPlaceholder /> 
      </Border> 
     </DockPanel> 
    </ControlTemplate>