2010-11-02 9 views
3

J'ai un TextBlock au sein d'un DockPanel dans un Border. Le TextBlock est lié aux données et peut être modifié avec un clavier à l'écran. Par conséquent, je l'ai accroché à la validation et cela fonctionne à merveille. Mon dilemme est que je peux seulement sembler changer le style de TextBlock quand il y a une erreur de validation. Je veux déclencher le style de Border. Comment puis-je faire ceci?Représentant une erreur de validation dans un contrôle qui ne fait pas partie du contrôle lié aux données?

Y at-il un moyen de lier le ErrorContents ailleurs dans la vue?

Répondre

3

Connectez-vous simplement à votre TextBox à partir d'un autre contrôle. Ci-dessous, j'ai lié la propriété Content d'un Label à la propriété TextBox (Validation.Errors) [0] .ErrorContent.

<DockPanel> 

    <!-- TextBox bound to a data object--> 
    <TextBox Name="textBox1" DockPanel.Dock="Top" Text="{Binding Path=Age, ValidatesOnExceptions=True, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"></TextBox> 

    <!-- A label that displays the errors from textBox1 --> 
    <Label Content="{Binding ElementName=textBox1, Path=(Validation.Errors)[0].ErrorContent}"></Label> 

</DockPanel> 
1

Je pense que cela va résoudre votre problème:

Xaml:

<Window x:Class="WpfErrorsBorderColor.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:WpfErrorsBorderColor="clr-namespace:WpfErrorsBorderColor" Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <Style x:Key="{x:Type WpfErrorsBorderColor:MyControl}" TargetType="{x:Type WpfErrorsBorderColor:MyControl}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="WpfErrorsBorderColor:MyControl" > 
        <Border Name="bd" > 
         <DockPanel LastChildFill="True" > 
          <TextBox Text="{Binding Path=Description,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" DockPanel.Dock="Top"/> 
          <TextBlock Name="textBlock" Text="{Binding Path=Description,ValidatesOnDataErrors=True,NotifyOnValidationError=True}"></TextBlock> 
         </DockPanel> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger SourceName="textBlock" Property="Validation.HasError" Value="True"> 
          <Setter TargetName="bd" Property="BorderBrush" Value="Red" /> 
          <Setter TargetName="bd" Property="BorderThickness" Value="4" /> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 
<WpfErrorsBorderColor:MyControl></WpfErrorsBorderColor:MyControl> 

code:

using System; 
using System.Windows; 
using System.Windows.Controls; 
using System.ComponentModel; 

namespace WpfErrorsBorderColor 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      Data data = new Data() { Description = "123" }; 

      DataContext = data; 
     } 
    } 

    public class Data : IDataErrorInfo, INotifyPropertyChanged 
    { 
     private string description; 
     public string Description 
     { 
      get { return description; } 
      set 
      { 
       if (description != value) 
       { 
        description = value; 

        if (PropertyChanged != null) 
         PropertyChanged(this, new PropertyChangedEventArgs("Description")); 
       } 
      } 
     } 

     string CheckLenght(string str) 
     { 
      return (str.Length < 1 || str.Length > 10) ? "Strign must be between 1 and 10 letters" : String.Empty; 
     } 


     public string Error 
     { 
      get { return CheckLenght(Description); } 
     } 

     public string this[string columnName] 
     { 
      get { return CheckLenght(Description); } 
     } 

     #region INotifyPropertyChanged Members 

     public event PropertyChangedEventHandler PropertyChanged; 

     #endregion 
    } 

    public class MyControl:UserControl 
    { 
     public MyControl() 
     { 

     } 
    } 
} 

ErrorContents vous pouvez lier la même manière;)