wpf - 调试 ElementName 绑定(bind)

标签 wpf data-binding

除了使用PresentationTraceSources.TraceLevel之外,还有其他方法可以进一步调试绑定(bind)吗?

我有一个相当复杂的问题,当 ElementName 绑定(bind)用于按钮上的 CommandParameter 时,该绑定(bind)失败(未找到该元素),该按钮是放置在 UserControl1 内的 UserControl2 的子级。 PresentationTraceSources.TraceLevel=High 的输出为(PåstandsListe 为 UserControl2):

System.Windows.Data Warning: 52 : Created BindingExpression (hash=8957325) for Binding (hash=61342683)
System.Windows.Data Warning: 54 :   Path: 'SelectedItem'
System.Windows.Data Warning: 56 : BindingExpression (hash=8957325): Default mode resolved to OneWay
System.Windows.Data Warning: 57 : BindingExpression (hash=8957325): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 58 : BindingExpression (hash=8957325): Attach to System.Windows.Controls.Button.CommandParameter (hash=426476)
System.Windows.Data Warning: 63 : BindingExpression (hash=8957325): Resolving source 
System.Windows.Data Warning: 66 : BindingExpression (hash=8957325): Found data context element: <null> (OK)
System.Windows.Data Warning: 70 :     Lookup name PåstandsListe:  queried Button (hash=426476)
System.Windows.Data Warning: 61 : BindingExpression (hash=8957325): Resolve source deferred
'Domstolene.JFS.GUI.vshost.exe' (Managed (v2.0.50727)): Loaded 'C:\Windows\assembly\GAC_64\System.Transactions\2.0.0.0__b77a5c561934e089\System.Transactions.dll', Symbols loaded.
System.Windows.Data Warning: 63 : BindingExpression (hash=8957325): Resolving source 
System.Windows.Data Warning: 66 : BindingExpression (hash=8957325): Found data context element: <null> (OK)
System.Windows.Data Warning: 70 :     Lookup name PåstandsListe:  queried Button (hash=426476)
System.Windows.Data Warning: 63 : BindingExpression (hash=8957325): Resolving source 
System.Windows.Data Warning: 66 : BindingExpression (hash=8957325): Found data context element: <null> (OK)
System.Windows.Data Warning: 70 :     Lookup name PåstandsListe:  queried Button (hash=426476)
System.Windows.Data Warning: 63 : BindingExpression (hash=8957325): Resolving source 
System.Windows.Data Warning: 66 : BindingExpression (hash=8957325): Found data context element: <null> (OK)
System.Windows.Data Warning: 70 :     Lookup name PåstandsListe:  queried Button (hash=426476)
System.Windows.Data Warning: 63 : BindingExpression (hash=8957325): Resolving source 
System.Windows.Data Warning: 66 : BindingExpression (hash=8957325): Found data context element: <null> (OK)
System.Windows.Data Warning: 70 :     Lookup name PåstandsListe:  queried Button (hash=426476)
System.Windows.Data Warning: 63 : BindingExpression (hash=8957325): Resolving source 
System.Windows.Data Warning: 66 : BindingExpression (hash=8957325): Found data context element: <null> (OK)
System.Windows.Data Warning: 70 :     Lookup name PåstandsListe:  queried Button (hash=426476)
System.Windows.Data Warning: 63 : BindingExpression (hash=8957325): Resolving source 
System.Windows.Data Warning: 66 : BindingExpression (hash=8957325): Found data context element: <null> (OK)
System.Windows.Data Warning: 70 :     Lookup name PåstandsListe:  queried Button (hash=426476)
System.Windows.Data Warning: 63 : BindingExpression (hash=8957325): Resolving source  (last chance)
System.Windows.Data Warning: 66 : BindingExpression (hash=8957325): Found data context element: <null> (OK)
System.Windows.Data Warning: 70 :     Lookup name PåstandsListe:  queried Button (hash=426476)
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=PåstandsListe'. BindingExpression:Path=SelectedItem; DataItem=null; target element is 'Button' (Name=''); target property is 'CommandParameter' (type 'Object')

更改没有任何效果:

  • 绑定(bind)到父元素 UserControl2 而不是 UserControl2。

非失败场景(此处 ElementName 绑定(bind)有效):

  • UserControl2 未放置在 UserControl1 内。
  • 按钮作为子项添加到 UserControl1 而不是 UserControl2。

此外,当我将 Snoop 附加到应用程序时,当我在 Snoop 中选择按钮时,ElementName 绑定(bind)开始工作(但 VS 输出窗口中不显示任何信息)。 Snoop 是否会以某种方式刷新绑定(bind)?

更新

问题似乎仅在按钮最初不可见时发生,例如放置在不可见的 Expander 和 TabItem 中。

最佳答案

选项卡和扩展器控件通常不会创建和初始化项目,除非它们可见,只有当它们第一次可见时,才会创建并初始化项目,这就是第一次绑定(bind)可能失败的原因。当元素未创建时,没有这样的解决方案,因为它没有出现在可视化树中。

原因很简单,如果您有一个模板化控件,则只有在该控件可见并添加到可视化树中时,才会创建该控件的模板。因此,模板内的项目不存在且无法绑定(bind),现在选项卡和扩展器的子项等不会与父项一起创建。

Snoop 可能会强制创建元素,这就是它出现的原因。

关于wpf - 调试 ElementName 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6290493/

相关文章:

wpf - PowerShell 可以用作 WPF 的代码吗

c# - 处理终止事件 C#

c# - 如何绑定(bind)到 WPF 中动态创建的单选按钮?

asp.net-mvc-3 - JSON 和 ASP.Net MVC Controller 不绑定(bind)对象列表的属性

c# - ImageSourceConverter 抛出 NullReferenceException ... 为什么?

c# - InvalidOperationException - TwoWay 或 OneWayToSource 绑定(bind)无法对只读属性起作用

rest - 发布到 Restful 服务器时的 Angular.js 动态绑定(bind)

wpf - 如何在 XAML 中将一个控件的引用传递给另一个控件

data-binding - eclipse rcp : how to bind a checkbox

javascript - 如何在 Knockout JS 中的 BindingHandler 中获取绑定(bind)表达式