WPF验证& IDataErrorInfo的

时间:2010-03-22 12:22:16

标签: wpf validation idataerrorinfo

注意 - 我所拥有的课程是EntityObject个课程!

我有以下课程:

public class Foo
{
    public Bar Bar { get; set; }
}

public class Bar : IDataErrorInfo
{
    public string Name { get; set; }

    #region IDataErrorInfo Members
    string IDataErrorInfo.Error
    {
        get { return null; }
    }

    string IDataErrorInfo.this[string columnName]
    {
        get
        {
            if (columnName == "Name")
            {
                return "Hello error!";
            }
            Console.WriteLine("Validate: " + columnName);
            return null;
        }
    }
    #endregion
}

XAML如下:

<StackPanel Orientation="Horizontal" DataContext="{Binding Foo.Bar}">
     <TextBox Text="{Binding Path=Name, ValidatesOnDataErrors=true}"/>
</StackPanel>

我在那里验证了断点和Console.Writeline - 我没有休息。验证未执行。任何人都可以按我反对我的错误所在的地方吗?

6 个答案:

答案 0 :(得分:2)

这可能是一个愚蠢的答案,但默认情况下,绑定会在LostFocus发生时调用setter。如果你还没有这样做,试试这样做。

如果您希望在每次按键时触发错误代码,请在绑定中使用UpdateSourceTrigger=PropertyChanged

答案 1 :(得分:1)

您忘记在'Bar'类上实现INotifyPropertyChanged,然后只有绑定系统才会触发setter。

所以你的'姓名'属性最有可能是。

public string Name 
    { 
          get{ return _name; } 
      set
      {
          _name = value;
          RaisePropertyChanged("Name"); // Or the call might OnPropertyChanged("Name");
      }
    }

答案 2 :(得分:1)

我不熟悉EntityObject类,也不能在.NET Framework文档或快速谷歌搜索中找到它。

无论如何,我们还需要使用NotifyOnValidationError

<TextBox Text="{Binding Path=Name, ValidatesOnDataErrors=true, NotifyOnValidationError=true}"/>

答案 3 :(得分:1)

尝试在绑定上设置Mode = TwoWay

答案 4 :(得分:1)

您应该创建包含Bar类引用的本地窗口资源,并使用其键来设置StackPanel数据上下文属性。另外,不要忘记在窗口或用户控件中导入其命名空间。

您的XAML代码应如下所示:

<Window x:Class="Project.WindowName"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:local="clr-namespace:BarNamespace">  
<Window.Resources>
 <local:Bar x:Key="bar" />
</Window.Resources>
<StackPanel Orientation="Horizontal" DataContext="{StaticResource bar}">
      <TextBox Text="{Binding Path=Name, ValidatesOnDataErrors=true}"/>
</StackPanel> 
</Window>

答案 5 :(得分:-1)

您应该将实现IDataErrorInfo的方法设为公共。