いいえ、私は失われています。私は昨日以来、私のデータバインディングが期待通りに機能しない理由を探しています。 私は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つの別々のビューで動作しますが、このビューでは動作しません。
または、私は間違った考え方をしていますか?
InsertLinesを「内部セット」にする。バウンドプロパティはpublic afaik – SvenG
にする必要があります(モデル、ビューモデル、TLTMoveULLine ...)。 – ken2k
@SvenG:いいですが、プロパティへの書き込みアクセスを防止したい場合はどうしますか? – FinalNotriX