WPF-验证数据模板

<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));
        }
    }
}
 

猜你喜欢

转载自blog.csdn.net/dxm809/article/details/89608665
今日推荐