注意 - 我所拥有的课程是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
- 我没有休息。验证未执行。任何人都可以按我反对我的错误所在的地方吗?
答案 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的方法设为公共。