web-dev-qa-db-ja.com

「{Binding Path =。}」と「{Binding}」は本当に等しいですか

WPFプロジェクトには、List<string>コレクションのアイテムを表示するListBoxがあります。これらのアイテムのテキストを編集可能にしたかったので、各アイテムをTextBoxを使用してItemTemplateにラップしました(最善の方法ではないかもしれませんが、WPFは初めてです)。 TextBoxesのTextプロパティを各項目の値に単純にバインドするのに問題がありました。パスプロパティ({Binding Path=.})に単一のドットまたはピリオドを使用した例を見つけました。

<ListBox ItemsSource="{Binding ElementName=recipesListbox,Path=SelectedItem.Steps}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Path=.}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

しかし、単に{Binding}を使用してもうまくいかなかった理由がわかりません。

Microsoftによる のように、「双方向バインディングにはパスまたはXPathが必要」という例外が発生しました。

[...]ピリオド(。)パスを使用して、現在のソースにバインドできます。たとえば、Text = "{Binding}"はText = "{Binding Path =。}"と同等です

誰かがこのあいまいな行動に光を当てることができますか?

EDIT:さらに、テキストを変更してフォーカスを移動しても更新されないため、{Binding Path=.}は必ずしも双方向バインディングを提供しないようです基になるソース(同じソースには、DataGridコントロールでプロパティが表示され、正常に変更されています)。ここに間違いがあります。

45
Fueled

例外のポイントは、おそらくバインディングソース自体を双方向でバインドできないことです。したがって、意図したとおりに動作しないバインディングを作成しないようにします。 {Binding Path=.}を使用すると、エラー処理をだますことができます。

(また、そのドキュメントが間違っているか不正確であることは前代未聞ではありませんが、MSDNのドキュメントは一般的に興味がありますが、通常は関心のある重要なポイントが含まれているためです)

27
H.B.

ドキュメントには、{Binding}{Binding Path=.}と同等であると記載されています。ただし、これはnot入力した{Binding Path}と同等です。 Pathプロパティを含める場合は、Path=.またはPath=OtherPropertyのいずれかにそれを割り当てる必要があります。

21
ceyko

これらは同じではありません。 ConsoleMessagesがObservableCollection文字列である場合に{Binding}だけでこれをバインドすると、「双方向のバインドにはパスまたはXPathが必要」になります。 {Binding Path =。}が機能する例外。これはWPF 4.0で...

    <ItemsControl x:Name="ConsoleOutput" ItemsSource="{Binding ConsoleMessages, Mode=OneWay}" MaxHeight="400">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Path=.}" BorderThickness="0" Margin="0" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

私の2pの価値...

7
user844705

つまり、この2つの違いは、従来の値渡しと参照渡しの違いに類似しています。 (FYR- 参照渡しと値渡しの違いは何ですか?

ただし、単に{Binding}を使用しても機能しなかった理由がわかりません(「双方向のバインドにはパスまたはXPathが必要」という例外が発生しました)

ここでは、{Binding}は、双方向バインディングに使用できます。一般に {Binding}は、datacontextの更新を許可しないdatacontextを持つ値ベースのリンクを作成します。

一方、{Binding Path=.}は、参照を介して値を更新できるようにする 'Path'によって参照されるメモリ領域との参照ベースのリンクを作成します(この場合は 'dot'現在のデータコンテキスト)。

お役に立てれば!

4
Vwake