ListBox.DisplayMemberPath无法按预期工作。我该怎么调试呢?

时间:2013-08-27 11:10:57

标签: wpf debugging data-binding

    <ListBox ItemsSource="{Binding Path=Commands}" DisplayMemberPath="Name"/>

DisplayMemberPath不起作用,ListBox显示ToString集合成员的默认Commands结果。是否可以调试它,例如,通过将一些信息打印到输出窗口?

Visual Studio 2010,WPF应用程序项目。绑定成功,我看到Commands集合的所有成员。但显示是错误的。

其他信息。如果我将Path=Commands更改为不存在的Path=Commands1,我会在“输出”窗口中看到错误消息。但DisplayMemberPath中没有关于错误的任何信息。

3 个答案:

答案 0 :(得分:1)

我在调试WPF中的绑定错误时遇到的一种更清晰/更清晰的方法通常是链接的(但使用较旧的,断开的链接),目前可在此处找到:http://www.zagstudio.com/blog/486#.UhyT8fNwbs0

具体而言,使用附加属性PresentationTraceSources.TraceLevel使用.Net 3.5中引入的调试功能的方法,并允许您指定特定的跟踪级别来调查绑定问题。

总结这里:

添加以下命名空间:

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

在绑定表达式中,设置附加属性。在我的示例中,我使用的Cars对象列表具有Name属性,并且错误地将DisplayMemberPath列为Names

<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')

整个链接值得一读,但这是我成功使用的特定技术的要点(如果链接死亡)。

答案 1 :(得分:0)

DisplayMemberPath 工作......你确定你正确使用它吗?您可以在MSDN的ItemsControl.DisplayMemberPath Property页面上找到它的示例。要使您的示例代码生效,您需要在Name对象的数据类型上拥有公共Commands属性。

如果失败,WPF错误通常会输出到Visual Studio Output窗口。如果您没有看到任何错误,请检查您是否正确设置了选项:

转到工具&gt;选项&gt;调试选项卡&gt; <输出窗口> WPF跟踪设置

您应该至少将其中一个选项(如数据绑定)设置为Warning,Error,All,Critical或Verbose以接收错误信息。

答案 2 :(得分:0)

如果你想使用Property&#34; Name&#34;您的&#34;命令&#34;项目,请使用以下

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

其中SelectedCommandsItem是模型的一个属性,它严格定义集合项的类型