【问题标题】:WPF Validation & IDataErrorInfoWPF 验证和 IDataErrorInfo
【发布时间】:2010-03-22 12:22:16
【问题描述】:

注意 - 我的课程是EntityObject classes!

我有以下课程:

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 - 我没有休息。不执行验证。任何人都可以按我的错误所在吗?

【问题讨论】:

    标签: wpf validation idataerrorinfo


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您忘记在“Bar”类上实现 INotifyPropertyChanged,那么只有绑定系统会触发 setter。

      所以您的“姓名”属性很可能应该是。

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

      【讨论】:

      • 但正如我上面提到的 - Foo 和 Bar 以及 EntityObject 类的子类(它确实通知 OnPropertyChange)。
      • 我实际上认为 EntityObject 父类会以某种方式影响这一点,因为 IDataErrorInfo 通常可以正常工作。
      • @Jefim:父/子类是什么意思?您提供的 Foo 和 Bar 不继承任何东西。如果您的意思是 Foo 和 Bar 被声明为某些 EntityObject 派生类的 inner 类,那么这根本不会改变任何东西。在 C# 中,内部类仅影响外部类成员的公共/受保护/私有可见性。它们对代码/事件/属性/继承/等行为没有影响。
      【解决方案3】:

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

      不管怎样,你需要做的我们也使用NotifyOnValidationError

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

      【讨论】:

        【解决方案4】:

        尝试在绑定上设置 Mode=TwoWay

        【讨论】:

        • 我认为这是 WPF 对 TextBox.Text denendency 属性的默认设置,所以在这里没关系。
        【解决方案5】:

        您应该创建包含 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>
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • OP 正在使用显式接口实现;这样做时禁止使用可见性修饰符。
          • 并且在使用显式接口实现时,根本不需要public。这仍然是接口的有效实现,并且会被接口客户端看到。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-14
          • 2014-05-23
          • 1970-01-01
          • 2011-05-03
          相关资源
          最近更新 更多