2011-03-30 79 views
40

在我的WPF項目中,我有一個ListBox來顯示List<string>集合中的項目。我想使這些項目的文本可編輯,所以我用TextBox將它們中的每一個都包裝在ItemTemplate中(可能不是最好的方法,但我是WPF的新手)。我無法簡單地將TextBoxes的Text屬性綁定到每個項目的值。「{綁定路徑=。}」和「{綁定}」真的相等

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

但是爲什麼簡單地使用{Binding}我不明白,沒有工作:我終於用一個點或期限path屬性({Binding Path=.})偶然發現了一個例子。

它提出了一個「雙向結合需要路徑或XPath」例外,因爲according to Microsoft:(。)

[...]可以使用路徑的期間以結合到當前資源。例如,文本=「{結合}」等同於文本=「{綁定路徑=}」

可能有人闡明這曖昧的行爲,光?

編輯:而且,似乎{Binding Path=.}不一定給雙向綁定,作爲修改的文本和移動聚焦不更新基礎源(同源也具有屬性顯示,並且在數據網格成功修改控制)。我肯定在這裏錯過了一些東西。

回答

20

該文檔指出{Binding}相當於{Binding Path=.}。但是,您輸入的是而不是相當於{Binding Path}。如果包含Path屬性,則必須將其分配給Path=.Path=OtherProperty

+2

這是一個錯字,現在已經修復。 – Fueled 2011-03-30 15:18:36

+0

但雙向綁定STILL失敗。它拒絕保存更改。如果您有ObsColl 並執行Path =。 Mode = TwoWay綁定,添加到集合工作正常。例如改變索引0處的數字。如果將數據網格綁定到它並指定數據網格列,它將拒絕使用Path =保存。 – user99999991 2015-06-13 01:59:30

7

這些不一樣。如果將ConsoleMessages綁定到ObservableCollection字符串且僅綁定{Binding},則會得到「雙向綁定需要Path或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值得...

24

異常的點可能是,你不能雙向綁定綁定源本身,因此它試圖阻止你從創建一個不符合你想要的方式的綁定。通過使用{Binding Path=.}您只需欺騙錯誤處理。

(而且這不是聞所未聞該文件中有錯誤或不準確的,雖然我不喜歡MSDN文檔很多一般,因爲它通常不會包含的關鍵點之一是興趣)

+4

+1:這是正確的答案。 [我剛剛遇到](http://stackoverflow.com/a/13089160/149265)這個現象我自己。 – 2012-10-26 14:48:33

+0

但雙向綁定STILL失敗。它拒絕保存更改。如果您有ObsColl 並執行Path =。 Mode = TwoWay綁定,添加到集合工作正常。例如改變索引0處的數字。如果將數據網格綁定到它並指定數據網格列,它將拒絕使用Path =保存。 – user99999991 2015-06-13 01:58:01

+0

@ user999999928:這就是我一直在說的:你只是欺騙錯誤處理。你犯了一個沒有被檢測到的錯誤,你仍然不會得到你想要的綁定,因爲你仍然綁定到無法檢測到更改的源。 – 2015-06-13 07:17:26

5

總之,兩者之間的差異類似於傳統價值傳遞和傳遞參考價值之間的差異。(FYR - What's the difference between passing by reference vs. passing by value?

但是爲什麼簡單地使用{}綁定沒有工作,我不明白(它提出了「雙向綁定需要路徑或XPath」除外)

讓現在假設在這裏,{Binding}可以用於雙向綁定。通常,{Binding}使用datacontext創建一個基於值的鏈接,該鏈接不允許更新datacontext。

{Binding Path=.}創建了基於引用的鏈接,該引用鏈接由'Path'引用的內存區域創建,允許通過引用更新值(在本例中爲'dot'當前的datacontext)。

希望這會有所幫助!

+0

使用ByRef和ByVal atleast給了我一個關於如何區分兩個綁定(使用Path和w/o)的想法。謝謝! – 2016-02-04 01:39:28