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