1

我的视图模型中有一个属性,它在某些条件下返回一个常量。

其实现与此类似:

    class Tmp : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public String Text
        {
            get { return "testing"; }
            set
            {
                PropertyChanged(this,new PropertyChangedEventArgs("Text"));                }
        }
    }

所以属性文本总是返回“测试”。

我将它绑定到一个文本框,如:

  <TextBox Text="{Binding Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

当应用程序启动时,文本框 correclty 表示正在测试。

现在,当我在文本框中键入内容时,将调用 setter,它调用 PropertyChanged。

在此之后(可能是 GUI)调用 getter 并获取值“testing”。

但是,文本框中的文本不会更改回测试。

所以我可以在文本框中输入“abc”,即使模型只是存储“测试”,文本框也会显示“abc”。

为什么每次击键时文本框中的文本都没有重置为“测试”?

4

1 回答 1

6

为什么文本框要再次获取文本?它只是将它写入您的源属性,它“知道”它必须相同,因为他正在告诉属性新值。否则,您将创建循环引用。您正在做的事情完全违背了物业所期望的准则和行为。

删除 setter,以一种方式绑定,在常量更改时提高 text 属性,并使文本框只读。请记住,不必在 setter 中调用 Propertychanged。

为了使您的初始方法有效,您需要打破“文本框更改属性但不会监听传入的提升”状态

set
{
   sUIDispatcher.BeginInvoke((Action)(() => Raise("Name")));
}

我想补充一点,这是一个非常糟糕的主意,并且强烈不鼓励你这样做。

于 2012-06-15T16:22:12.957 回答