S / L 4 & IDataErrorInfo - Как вызвать повторную проверку элемента управления (при касании соответствующего элемента управления) - PullRequest
4 голосов
/ 14 января 2011

У меня есть два элемента управления, связанные со свойствами MinCartValue и MaxCartValue.MinCartValue должно быть меньше, чем MaxCartValue.Чтобы добиться этой проверки, я реализовал интерфейс IDataErrorInfo и запустил вышеупомянутую проверку в методе this [columnName], если коснулись либо MinCartValue, либо MaxCartValue.ValidatesOnDataErrors = True устанавливается в привязке обоих элементов управления.Проверка работает правильно, выделяя каждый элемент управления, когда изменение значения его свойства нарушает правило.Проблема заключается в том, что после того, как элемент управления помечен как недействительный, если пользователь исправляет проблему, изменяя значение другого элемента управления, первый элемент управления остается помеченным как недействительный.Это понятно, потому что метод IDataErrorInfo не проверял свойство первого элемента управления.

Итак, мне нужен способ принудительной повторной проверки свойства # 1 (или способ очистки недопустимого состояния)когда свойство # 2 проверено, и наоборот.Я пытался вызвать RaisePropertyChanged в моем методе this [columnName], но он ничего не делает.Также попытался установить свойство в его собственное значение, чтобы попытаться обмануть его, чтобы проверить себя, но опять ничего не происходит.

Спасибо

Ответы [ 4 ]

2 голосов
/ 14 января 2011

Я бы порекомендовал взглянуть на интерфейс INotifyDataErrorInfo (представлен в Silverlight 4).Он может асинхронно уведомлять, если свойства становятся недопустимыми, поэтому я думаю, что среда лучше учитывает это во многих свойствах, вместо того, чтобы ожидать, что свойство, которое в настоящее время изменяется, является единственным, чья действительность может изменяться.

1 голос
/ 20 мая 2011

У меня было два свойства DateTime (DateFrom и DateTo), которые нужно было проверять друг на друга. В установщиках для этих свойств я только что вызвал событие PropertyChanged для DateTo и DateFrom. Работал как шарм.

0 голосов
/ 21 марта 2011

Вот как я это решил. Допустим, Property1 и Property2 зависят от кода. Я не знаком с MVVM (пока), но вы, вероятно, расширяете свой класс сущностей для реализации IDataErrorInfo. В этом случае вы также можете расширить На [Свойство] Измененный метод и сообщить об изменении в зависимом свойстве:

partial class YourEntity : IDataErrorInfo
{
    public string this[string columnName]
        {
            //Your validation logic
        }

    public string Error
    {
        //WPF doesn't use it anyway
        get { return string.Empty; }
    }

    partial void OnProperty1Changed() 
    {
        OnPropertyChanging("Property2");
        OnPropertyChanged("Property2");
    }

    partial void OnProperty2Changed()
    {
        OnPropertyChanging("Property1");
        OnPropertyChanged("Property1");
    }
}

В этом случае обновление любого из этих свойств заставляет оба связанных элемента управления переоценивать себя.

EDIT2: похоже, что вы должны использовать OnPropertyChang * вместо ReportPropertyChang *. ReportPropertyChanged уведомит платформу сущностей о том, что в модели ожидают изменения, но на самом деле все, что вы пытаетесь сделать, это проинформировать представление. Вы не хотите обновлять базу данных с помощью свойства, которое на самом деле не изменилось. ReportPropertyChang * также завершится ошибкой для вычисляемых полей, которые не имеют сопоставлений в базе данных. EDIT1: обнаружил, что необходимо вызвать ReportPropertyChanging до ReportPropertyChanged.

0 голосов
/ 14 января 2011

Я не уверен, правильно ли я понимаю вашу проблему, но, возможно, это может помочь. Может помочь пример XAML и код свойства привязки.

Это звучит как проблема вашего кода в зависимости от стандартного UpdateSourceTrigger, который в случае элементов управления TextBox является их фокусом / не фокусировкой. Вы можете установить в XAML атрибут UpdateSourceTrigger, добавив UpdateSourceTrigger = Explicit к вашей привязке, где происходит проверка. Затем в каждом TextBox (MinCartValue, MaxCartValue) добавьте обработчик события к событию TextChanged.

В программном коде в обработчике событий вы можете сделать что-то вроде этого:

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        TheTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
    }

TheTextBox в этом случае будет одним из элементов управления вашей корзиной. Метод UpdateSource () - это способ вручную обновить значение привязки, что должно вызвать вашу проверку. Этот метод позволяет связать триггер для обновления значений, а свойства повышения изменились за пределами области действия по умолчанию (в данном случае используется изменение текста вместо фокуса и расфокусировки на TextBox).

...