1

ビューモデルに、特定の条件下で定数を返すプロパティがあります。

これと同様に実装されます:

    class Tmp : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

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

したがって、プロパティTextalwasysは「testing」を返します。

私はこれを次のようなテキストボックスにバインドしました:

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

アプリケーションが起動すると、テキストボックスに「テスト中」と表示されます。

これで、テキストボックスに何かを入力すると、PropertyChangedを呼び出すセッターが呼び出されます。

この後、何か(おそらくGUI)がゲッターを呼び出し、値「testing」を取得します。

ただし、テキストボックス内のテキストはテストに戻されません。

したがって、テキストボックスに「abc」と入力すると、モデルに「テスト」が格納されているだけでも、テキストボックスに「abc」と表示されます。

キーストロークごとにテキストボックスのテキストが「テスト」にリセットされないのはなぜですか。

4

1 に答える 1

6

Why should the textbox get the text again? It just wrote it into your source property it "knows" that it must be the same, because he is in the middle of telling the property the new value. Otherwise you would create circular references. What you are doing is going completely against guidelines and behavior expected from a property.

Remove the setter, make the binding one way, raise the text property when your constant is changed, and make the textbox readonly. Remember, its not necessary to call Propertychanged in the setter.

To make your initial approach work, you need to break out of the "Textbox changes property but won't listen for incoming raises" state

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

i would like to add, that this is a REALLY bad idea and strongly discourage you to do it like that.

于 2012-06-15T16:22:12.957 に答える