Привязка не обновляется, когда я устанавливаю переменную в сеттере - PullRequest
0 голосов
/ 15 января 2012

У меня есть текст, привязанный к свойству следующим образом

Ожидается, что пользователь введет имя файла. Однако иногда пользователи могут вводить недопустимые символы. Таким образом, мое свойство поддержки в View Model выглядит так, как показано ниже

private string outputFileName;
public string OutputFileName
    {
        get 
        {
            return outputFileName;
        }
        set 
        {
            string temp = value;
            if (true == IsValidFileName(temp))// this function uses Path.Getinvalidfilechars
            {
                outputFileName = value;

            }
            else
            {
                MessageBox.Show(string.Format("{0} contains one or more invalid characters  
                for a file Name",temp));
            }
            base.OnPropertyChanged("OutputFileName");
        }
    }

Вот проблема, текстовое поле все еще показывает недопустимый символ. почему OnPropertyChanged не заставляет текст в текстовом поле возвращаться к старому значению без недопустимого символа. Как я могу получить такое поведение

Ответы [ 2 ]

0 голосов
/ 15 января 2012

В операторе else вспомогательному полю для OutputFileName не присваивается другое значение.Если вы хотите вернуться к предыдущему значению, сохраните его в другой переменной и обновите вспомогательное поле в операторе else, а затем событие измененного свойства изменит интерфейс со старым значением.Хотя я не думаю, что это очень хороший пользовательский опыт.

Лучшим решением было бы использование некоторых валидаторов и информирование пользователя о том, что ввод необходимо исправить, а не просто возврат значения обратно кпредыдущее значение.

Google запустит "проверку wpf" или начните с этого вопроса SO: Рекомендации по привязке и проверке данных WPF

0 голосов
/ 15 января 2012

Какой базовый класс вашего класса определяет OutputFileName?Похоже, что метод класса OnPropertyChange проверяет, действительно ли значение свойства изменилось до запуска события PropertyChanged.Я попробовал ваш пример с классом, который непосредственно реализует INotifyPropertyChanged и делает

if (PropertyChanged != null)
{
    PropertyChanged(this, new PropertyChangedEventArgs("OutputFileName"));
}

, и это работает, как вы ожидаете.Хотя я согласен с Марком, показывать MessageBox от установщика свойств довольно редко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...