2

ViewModel で選択変更イベントを a からコマンドにバインドする問題に遭遇するまで、私は同一であると考え{Binding DataContext.foo}ていました。{Binding foo}ComboBox

こんな感じでやってたのに…

<i:EventTrigger EventName="SelectionChanged">
     <cmd:EventToCommand Command="{Binding DataContext.TestCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Page}}}" />
</i:EventTrigger>

DataContext.TestCommand指定するだけで機能しますが、使用TestCommandすると失敗するように見えます。2つの違いに遭遇したことはありませんが、誰かがそれを説明できますか?

4

2 に答える 2

2

ビジュアル ツリー ( View ) のほとんどの要素は、プロパティごとにデータ レイヤー ( ViewModel )にリンクされていDataContextます。もちろん、ほとんどのコントロールは親から継承するだけなので、データ レイヤー ツリーははるかに単純です。

デフォルトでは、aはin data layerBindingを探します。Pathただし、RelativeSource(likeRelativeSource.Selfまたは with AncestorType) または anを指定すると、ビジュアル レイヤーElementNameBinding切り替わり、バインドされたプロパティのコントロールが検索されます。これDataContextでデータレイヤーに戻ることができます。

于 2013-08-10T23:08:04.317 に答える
2

それらは 2 つの微妙に異なるものにバインドされています。

"Binding DataContext.TestCommand"TestCommandあなたの のプロパティにバインドされていますDatacontext(おそらくコンテキストがそのプロパティを定義しています)Page

"Binding TestCommand"TestCommandそれ自体のプロパティにバインドされていますがPage、この場合はおそらく存在しないため、機能しません。

実行中にバインドを検査するために使用できる WPF Snoop と呼ばれる優れたプログラムがあります (行き詰まったときに物事を理解するのに役立つことがよくあります)。

于 2013-08-10T22:58:06.777 に答える