除了使用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/