WPF MVVM Привязка данных В текстовом поле зависимость перезаписывает ввод или не обновляет ввод - PullRequest
0 голосов
/ 07 февраля 2019

Это должно быть общая проблема с решением для этого, но я не могу найти его.Мне нужно иметь возможность установить значение в текстовом поле, но текстовое поле часто обновляется внешним источником (в данном случае PLC).Когда оно обновляется из источника, я хочу отобразить обновленное значение в текстовом поле (но не тогда, когда пользователь печатает), не вызывая метод, вызываемый из установщика свойства зависимости.

У меня естьбазовое текстовое поле, которое связано со свойством зависимости в коде xaml модели представления.

<TextBox Text="{Binding A}" />

Свойство выглядит следующим образом

private string _a;
public string A
get
        {
            return _a;
        }
        set
        {
            if (value != _a)
            {
                Set(ref _a, value);
                SomeMethod(value);
            }
        }

Здесь я попытался обновить поле

_a = ValueFromAnotherSource;

Что не обновляет представление, если я не запускаю

RaisePropertyChanged(String.Empty);

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

В качестве альтернативы я могу написать всвойство

A = ValueFromAnotherSource;

Но вызывается SomeMethod (значение), а это не то, что мне нужно, его следует вызывать только в том случае, если значение изменяется от пользователя, печатающего на экране

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Я уверен, что стандартные боги кодирования поразят меня за это:

private string _a;
private bool _manuallySettingA;
public string A
{
    get { return _a; }
    set
    {
        if (value != _a)
        {
            Set(ref _a, value);
            if(!_manuallySettingA)
                SomeMethod(value);
        }
    }
}

public void ManuallySetA(string value)
{
    _manuallySettingA = true;
    A = value;
    _manuallySettingA = false;
}
0 голосов
/ 07 февраля 2019

Используйте другой метод, который вызывается, когда обновление происходит из другого источника, чем пользовательский ввод.Т.е.

void SetA(string value)
{
  if (value != _a)
  {
      Set(ref _a, value);
  } 
}

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

И вы не будете звонить SomeMethod, когда _a необходимо обновить из других источников.

Конечно, SetA обновит значение пользовательского интерфейса, если упомянутый вами Set(ref _a, value) метод вызовет событие PropertyChanged.

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