<Window x:Class="WpfApp10.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp10"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<TextBlock DockPanel.Dock="Right" Foreground="Red" FontSize="14" FontWeight="Bold"
ToolTip="{Binding ElementName=adornedElementPlaceholder,Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
<TextBlock.Text>
<!--<Binding Path="AdornedElement.(Validation.Errors)[0].ErrorContent" ElementName="adornedElementPlaceholder"></Binding>-->
*
</TextBlock.Text>
</TextBlock>
<Border BorderBrush="Green" BorderThickness="1">
<AdornedElementPlaceholder Name="adornedElementPlaceholder"></AdornedElementPlaceholder>
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<TextBox HorizontalAlignment="Left" Height="23" Margin="547,84,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" Validation.Error="TextBox_Error">
<TextBox.Text>
<Binding Path="Age" NotifyOnValidationError="True">
<Binding.ValidationRules>
<DataErrorValidationRule></DataErrorValidationRule>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<TextBox HorizontalAlignment="Left" Height="23" Margin="547,138,0,0" TextWrapping="Wrap" Text="{Binding Path=Name}" VerticalAlignment="Top" Width="120"/>
<ListBox Name="lstBox" HorizontalAlignment="Left" Height="272" Margin="127,84,0,0" VerticalAlignment="Top" Width="263">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBox Margin="3" Validation.Error="TextBox_Error">
<TextBox.Text>
<Binding Path="Age" NotifyOnValidationError="True">
<Binding.ValidationRules>
<DataErrorValidationRule></DataErrorValidationRule>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<TextBox Text="{Binding Name}" Margin="3"></TextBox>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Window>
/***********************************************************************************/
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApp10
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Person p = new Person();
p.Age = 10;
p.Name = "zs";
this.DataContext = p;
ObservableCollection<Person> persons = new ObservableCollection<Person>();
persons.Add(new Person() { Age = 10, Name = "zs"});
persons.Add(new Person() { Age = 10, Name = "zs"});
persons.Add(new Person() { Age = 10, Name = "zs"});
lstBox.ItemsSource = persons;
//lstBox.DisplayMemberPath = "Age";
}
private void TextBox_Error(object sender, ValidationErrorEventArgs e)
{
if (e.Action== ValidationErrorEventAction.Added)
{
MessageBox.Show(e.Error.ErrorContent.ToString());
}
}
}
public class Person:INotifyPropertyChanged,IDataErrorInfo
{
private int _Age = 0;
public int Age
{
get
{
return _Age;
}
set
{
_Age = value;
OnPropertyChanged("Age");
}
}
private string _Name = "";
public string Name
{
get
{
return _Name;
}
set
{
_Name = value;
OnPropertyChanged("Name");
}
}
public string Error
{
get
{
return "";
}
}
string IDataErrorInfo.this[string columnName]
{
get
{
bool valid = true;
if (columnName=="Age")
{
if (Age<0)
{
valid = false;
}
}
if (!valid)
{
return "Age can not be negative";
}
else
return "";
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
}
}
}