Я думаю, что это решит вашу проблему:
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>
Код:
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 вы можете связать таким же образом;)