2012-01-25 7 views
1

いいえ、私は失われています。私は昨日以来、私のデータバインディングが期待通りに機能しない理由を探しています。 私はWPFとMVVMを初めて使い慣れているので、2つの他のビューを持つ同じプロジェクトで同じアプローチを使用しないと理解できます。データバインディング/ PropertyChangedがnullです

重要な構成は、3つのビューを持っていることです。それらのすべてについて、MainWindows-ConstructorのDataContextを責任あるViewModelに設定します。

ビューモデル自体はIPropertyChangedを実装していませんが、モデルにはいくつかのネストされたオブジェクトがあります。

は、私は次のXAMLでバインド:

<TextBox Grid.Column="1" Grid.Row="0" Margin="1"> 
       <TextBox.Text> 
        <Binding Path="Model.InsertLine.Destination.Value" UpdateSourceTrigger="PropertyChanged"> 
         <Binding.ValidationRules> 
          <local:MinMaxLengthValidatonRule Min="7" Max="7"/> 
         </Binding.ValidationRules> 
        </Binding> 
       </TextBox.Text> 
      </TextBox> 

InsertLineがにPropertyChangedた:

public TLTMoveULLine InsertLine 
    { 
     get { return _insertline; } 
     internal set 
     { 
      _insertline = value; 
      if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("InsertLine")); 
     } 
    } 

一般的には、先に結合し、ユニットが動作します。検証と同じです。

しかし、ObeservableCollection(_document.Lines)に挿入された後、ある時点で新しい挿入線を設定します。私は何が起こると思いますか(そして2つの他のビューで何が起こるか)は、テキストボックスがクリアされることです。

public void AddLine() 
    { 
     _document.Lines.Add(InsertLine); 
     TLTMoveULLine newline = new TLTMoveULLine(); 

     newline.Destination.Value = InsertLine.Destination.Value; 
     newline.Unit.Value = ""; 

     InsertLine = newline; 
    } 

InsertLineのgetのプロパティが呼び出されます、しかしにPropertyChangedデリゲートはnullです。

なぜ誰かがそれがヌルであるという考えを持っていますか?同じアプローチは2つの別々のビューで動作しますが、このビューでは動作しません。

または、私は間違った考え方をしていますか?

+5

InsertLinesを「内部セット」にする。バウンドプロパティはpublic afaik – SvenG

+0

にする必要があります(モデル、ビューモデル、TLTMoveULLine ...)。 – ken2k

+0

@SvenG:いいですが、プロパティへの書き込みアクセスを防止したい場合はどうしますか? – FinalNotriX

答えて

7

わかりました。 それは絶対にばかげた監視だった。この問題を持っている誰のために

: あなたはPropertyChangedイベントを持っていないだけで、あなたはそれを呼び出していることを確認してください、あなたはまた、インターフェイスから継承する必要があります。モデルの定義の後にINotifyPropertyChangedを配置するのを忘れてしまいました。

私はいつも好奇心の質問に私をもたらします: 私はいつもインターフェイスは何も契約以上のものではないと思っていましたが、本質的に違いはありませんが、私はWPFが反射/オブジェクトがバインド可能な場合。私はおおよそそこにいるのですか?

+0

あなたは私の問題を解決しました。 :)私はどこかで、正確に何が起こるのかを読みます - DataContextはINotifyPropertyChangedに対してチェックされています(反射は必要ありません) – lisp

0

似たような問題がありましたが、私の間違いは、INotifyPropertyChangedを実装したクラスがプライベートであることでした。それを公にして私のケースを解決しました。

関連する問題