我的视图模型中有一个属性,它在某些条件下返回一个常量。
实现与此类似:
class Tmp : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public String Text
{
get { return "testing"; }
set
{
PropertyChanged(this,new PropertyChangedEventArgs("Text")); }
}
}
所以属性Text alwasys返回“testing”。
我把它绑定到一个文本框,如:
<TextBox Text="{Binding Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
当应用程序启动时,文本框correclty表示测试。
现在当我在文本框中输入内容时,调用setter,调用PropertyChanged。
在此之后(可能是GUI)调用getter并获取值“testing”。
但是,文本框中的文本不会更改回测试。
所以我可以在文本框中键入“abc”,文本框显示“abc”,即使模型只是存储“测试”。
为什么文本框中的文字在每次击键时都没有重置为“测试”?
答案 0 :(得分:6)
文本框为什么要再次获取文本?它只是将它写入你的源属性它“知道”它必须是相同的,因为他正在告诉属性新值。否则你会创建循环引用。你正在做的是完全违反财产预期的准则和行为。
删除setter,使绑定成为一种方式,在更改常量时引发text属性,并使文本框只读。请记住,没有必要在setter中调用Propertychanged。
要使您的初始方法有效,您需要打破“文本框更改属性但不会侦听传入的加注”状态
set
{
sUIDispatcher.BeginInvoke((Action)(() => Raise("Name")));
}
我想补充一点,这是一个非常糟糕的主意,强烈反对你这样做。