WPF MVVM数据绑定文本框依赖项覆盖输入或不更新输入

时间:2019-02-07 17:41:47

标签: c# wpf mvvm

这必须是解决此问题的常见问题,但我找不到它。 我需要能够在文本框中设置一个值,但是该文本框通常是由外部源(在这种情况下为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(value)被调用了,这不是我想要的,只有在用户在屏幕上键入时更改了值时才应调用

2 个答案:

答案 0 :(得分:0)

我敢肯定,编码标准Gods会为此而sm惜我的:

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;
}

答案 1 :(得分:-1)

使用其他方法(当更新来自用户输入以外的其他来源时调用)。即

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

您将能够区分呼叫是来自用户还是来自其他来源。

需要从其他来源更新_a时,您将不会呼叫SomeMethod

如果您提到的SetA方法引发PropertyChanged事件,当然Set(ref _a, value)将更新UI值。