Изменить текстовое значение с привязкой к текстовому полю в наборе доступа - PullRequest
1 голос
/ 06 февраля 2010

Я надеюсь, что кто-то может помочь мне с этим, я подозреваю, что я делаю что-то глупое. Я связал TextBox так, что Text связан с InputValue. В основном, когда текстовое значение изменяется, у меня есть метод (Inches.Parse), который проверяет значение и возвращает хорошо отформатированную строку.

Если при разборе нет ошибок, я хочу, чтобы текстовое поле имело хорошо отформатированную строку с именем «result». Тем не менее, TextBox не будет отображать новый текст? Любая помощь будет оценена.

public string InputValue 
{
    get
    {
        return _inputValue;
    }
    set
    {
        if (_inputValue != value)
        {                                        
            bool error;
            string result = Inches.Parse(value, 64, out error);                    

            if (error != IsValid)
            {
                IsValid = error;
            }
            if (!error)
            {
                _inputValue = result;
            }
            else
            {
                _inputValue = value;
            }

            NotifyPropertyChanged("InputValue");
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 07 февраля 2010

Это ошибка / проблема, которая, вероятно, будет исправлена ​​в dot net 4.0

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

Application.Current.Dispatcher.BeginInvoke((Action)delegate { NotifyPropertyChanged("InputValue"); });

вставь это в свой сеттер, и у тебя все будет хорошо ..

1 голос
/ 06 февраля 2010

Кажется, проблема в том, что TextBox не будет обновлять представленное значение во время обновления свойства источника, с которым оно связано само.

Обходным путем может быть установка этого связующего выражения

{Binding Path=InputValue, Mode=TwoWay,UpdateSourceTrigger=Explicit}

обратите внимание на UpdateSourceTrigger=Explicit это говорит о том, что вы обновите источник вручную

затем вы добавляете обработчик к событию TextBox LostFocus (поэтому мы уверены, что пользователь закончил редактирование)

textBox1.LostFocus +=
(s, e) =>
  {
    var text = textBox1.Text;
    [DataSource].InputValue = text;
  };

Поэтому, когда TextBox теряет фокус, значение в источнике данных будет обновлено и отформатировано, а затем TextBox будет восстановлен.

Надеюсь, это поможет вам.

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