UpdateSourceTrigger不工作?

时间:2013-02-11 23:49:00

标签: c# wpf

我正在尝试在按下某个键时验证文本框中的文本。这是显示我正在尝试做的最短代码示例:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBox FontSize="15" HorizontalAlignment="Left" Name="txtEmail" VerticalAlignment="Top" Width="135"
                 Text="{Binding ValidationRules.EmailAddress, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}"/>
    </Grid>
</Window>

“ValidationRules”类:

 class ValidationRules
    {
        string email = "";
        public string EmailAddress
        {
            get
            {
                return email;
            }

            set
            {
                Console.WriteLine("Setting!");
                //Only check if there is any text for now...
                if (String.IsNullOrWhiteSpace(value))
                {
                    throw new Exception();
                }

                email = value;
            }
        }

    }

当我开始在文本框中输入时,即使我使用UpdateSourceTrigger=PropertyChanged,我也不会将“设置”作为控制台输出。我已经完成了我的研究,但我能找到的所有例子都是长时间的混乱和混乱。如果您能指出我在验证中遇到的任何其他错误,我也将不胜感激,但如果可能,请尝试用简单的术语解释,因为我是WPF的新手。

1 个答案:

答案 0 :(得分:3)

设置DataContext的位置一定是个问题。

这个例子似乎工作正常:

代码:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
        ValidationRules = new ValidationRules();
    }

    private ValidationRules _validation;
    public ValidationRules ValidationRules
    {
        get { return _validation; }
        set { _validation = value; NotifyPropertyChanged("ValidationRules"); }
    }


    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
 }

public class ValidationRules : INotifyPropertyChanged
{
    string email = "";
    public string EmailAddress
    {
        get
        {
            return email;
        }

        set
        {
            Console.WriteLine("Setting!");
            //Only check if there is any text for now...
            if (String.IsNullOrWhiteSpace(value))
            {
                throw new Exception();
            }
            email = value;
            NotifyPropertyChanged("EmailAddress");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

}

的Xaml

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Class="WpfApplication1.MainWindow"
        Title="MainWindow" Height="125.078" Width="236.441" x:Name="UI" >
    <Grid DataContext="{Binding ElementName=UI}">
        <TextBox FontSize="15" HorizontalAlignment="Left" Name="txtEmail" VerticalAlignment="Top" Width="135"
                 Text="{Binding ValidationRules.EmailAddress, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}"/>
    </Grid>
</Window>