2013-08-27 102 views
2
<ListBox ItemsSource="{Binding Path=Commands}" DisplayMemberPath="Name"/> 

DisplayMemberPath不起作用,並且列表框顯示Commands集合成員的默認ToString結果。是否可以調試這個,例如,通過將一些信息輸出到輸出窗口?ListBox.DisplayMemberPath不能按預期工作。我怎樣才能調試呢?

Visual Studio 2010,WPF應用程序項目。綁定成功,我看到Commands集合的所有成員。但顯示是錯誤的。

其他信息。如果我將Path=Commands更改爲不存在Path=Commands1,則會在「輸出」窗口中看到錯誤消息。但在DisplayMemberPath中沒有關於錯誤的任何信息。

+3

你的類是否實現了一個名爲'Name'的屬性? – Jehof

+0

@Jehof - 是的,當然。我在這裏學習很有意思,我該如何調試這種情況。 –

回答

0

DisplayMemberPath確實工作...你確定你正確使用它嗎?您可以在MSDN的ItemsControl.DisplayMemberPath Property頁面找到它的一個例子。爲了讓您的示例代碼正常工作,您需要在Commands對象的數據類型上擁有一個公開的Name屬性。

如果失敗,WPF錯誤通常會輸出到Visual Studio輸出窗口中。如果您沒有看到任何錯誤存在,檢查是否已正確設置選項:

轉到工具>選項>調試選項卡>輸出窗口> WPF跟蹤設置

你應該至少有下列選項之一(如數據綁定)設置爲「警告」,「錯誤」,「全部」,「嚴重」或「詳細」以接收錯誤信息。

+0

WPF跟蹤設置,綁定設置爲全部。但在輸出窗口中沒有關於DisplayMemberPath的信息。 –

+0

你可以確認你已經綁定到ListBox.ItemsSource屬性的數據類型中有一個名爲'Name'的公共屬性嗎? – Sheridan

+1

是的,它有這樣的屬性。順便說一句,問題是關於調試,而不是「爲什麼它不工作」。所以,關於WPF跟蹤設置的信息就是我正在尋找的內容,但在這種情況下它並沒有幫助。 –

1

其中一個更清晰/更簡潔的方式我已經遇到了在WPF調試綁定錯誤往往與(但使用的是舊,破鏈接),目前可以在這裏找到:http://www.zagstudio.com/blog/486#.UhyT8fNwbs0

具體而言,該方法它使用.Net 3.5中引入的調試功能,使用附加的屬性PresentationTraceSources.TraceLevel,並允許您指定特定的跟蹤級別來調查綁定問題。

這裏總結:

您添加下面的命名空間:

<Window 
<!-- Window Code --> 
xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase" 
/> 

而在你的綁定表達式,設置附加屬性。在我的例子中,我使用Cars對象的列表與Name屬性,和錯誤地列出的DisplayMemberPathNames

<ListBox ItemsSource="{Binding Path=Cars, diagnostics:PresentationTraceSources.TraceLevel=High}" DisplayMemberPath="Names" /> 

這導致在輸出窗口下面的消息中(發生多次,一個對於每個失敗的綁定):

System.Windows.Data Error: 40 : BindingExpression path error: 'Names' property not found on 'object' ''Car' (HashCode=59988153)'. BindingExpression:Path=Names; DataItem='Car' (HashCode=59988153); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String') 

整個鏈路是值得一讀,但是這是一個特別的技術,我與成功(如果鏈接死亡)的要點。

+0

這給了很多信息,但在我的情況下沒有任何關於DisplayMemberPath。有趣的是用ItemTemplate代替DisplayMemberPath。 –

+0

奇怪的是,這似乎意味着綁定實際上正在工作(DisplayMemberPath是正確的),但模板有問題o.O – Chris

0

,如果你想使用「名稱」屬性的「命令」項目,普萊舍使用以下

<ListBox ItemsSource="{Binding Path=Commands}" SelectedItem="{Binding SelectedCommandsItem, Mode=TwoWay}" DisplayMemberPath="Name"/> 

哪裏SelectedCommandsItem是嚴格定義類型的集合項的模型的屬性