2010-03-22 3 views
4

Примечание. У меня есть классы EntityObject!WPF Validation & IDataErrorInfo

У меня есть следующий класс:

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 по валидации там - я не получаю перерывы. Проверка не выполняется. Может ли кто-нибудь просто нажать меня на место, где лежит моя ошибка?

ответ

1

Вы забыли реализовать INotifyPropertyChanged в классе «Bar», тогда только система привязки вызовет сеттер.

Так что, скорее всего, ваше свойство «Имя» должно быть.

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

Но, как я уже упоминал выше - как Foo и Bar и дочерние классы класса EntityObject (который не уведомит OnPropertyChange). – Jefim

+0

Я действительно думал, что родительский класс EntityObject может каким-то образом повлиять на это, поскольку IDataErrorInfo обычно работает нормально. – Jefim

+0

@Jefim: что вы подразумеваете под родительскими/дочерними классами? Представленные вами Foo и Bar не наследуют ни от чего. Если вы имели в виду, что Foo и Bar объявлены как ** внутренние ** классы некоторого производного класса EntityObject, то это ничего не меняет. В C# внутренние классы влияют только на публичную/защищенную/закрытую видимость членов внешнего класса. Они не влияют на поведение кода/события/свойства/наследования/etc. – quetzalcoatl

1

Я не знаком с классом EntityObject и не могу найти его в документации по .NET Framework или в быстром поиске в Google.

Во всяком случае, то, что вам нужно сделать, мы используем NotifyOnValidationError, а также:

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

Вы должны сделать методы, реализующие IDataErrorInfo общедоступными.

+0

OP использует реализацию эксклюзионного интерфейса; модификаторы видимости запрещены, когда вы это делаете. – Bevan

+0

и при использовании явной реализации интерфейса 'public' вообще не требуется. Это по-прежнему действительная реализация интерфейса и будет видна интерфейсом клиентов. – quetzalcoatl

1

Попробуйте установить режим = TwoWay на ваше связывание

+0

Я думаю, что это свойство WPF по умолчанию для свойства denverency TextBox.Text, поэтому здесь это не имеет значения. – quetzalcoatl

2

Это может быть глупым ответ, но по умолчанию обязательных вызовов сеттера, когда LostFocus происходит. Попытайтесь сделать это, если вы этого не сделали.

Если вы хотите, чтобы код ошибки запускался при каждом нажатии клавиши, используйте UpdateSourceTrigger=PropertyChanged внутри привязки.

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> 
Смежные вопросы