Проверка WPF и IDataErrorInfo - PullRequest
       11

Проверка WPF и IDataErrorInfo

4 голосов
/ 22 марта 2010

Примечание - у меня есть классы 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 ]

2 голосов
/ 18 июля 2011

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

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

1 голос
/ 08 января 2012

Вы должны создать локальный ресурс окна, содержащий ссылку на класс 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>
1 голос
/ 14 июня 2011

Попробуйте установить Mode = TwoWay для вашей привязки

1 голос
/ 04 января 2011

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

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

<TextBox Text="{Binding Path=Name, ValidatesOnDataErrors=true, NotifyOnValidationError=true}"/>
1 голос
/ 22 марта 2010

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

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

public string Name 
    { 
          get{ return _name; } 
      set
      {
          _name = value;
          RaisePropertyChanged("Name"); // Or the call might OnPropertyChanged("Name");
      }
    }
0 голосов
/ 27 мая 2011

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

...