Debug ElementName绑定

时间:2011-06-09 09:09:21

标签: wpf data-binding

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

我有一个相当复杂的问题,当在一个Button上的CommandParameter上使用它时,ElementName绑定失败(找不到该元素),该Button是位于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')

更改没有任何影响:

  • 绑定到的父元素 UserControl2而不是UserControl2。

非失败的场景(这里的ElementName绑定有效):

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

当我将Snoop附加到应用程序时,当我在Snoop中选择Button时,ElementName绑定开始工作(但VS Output窗口中没有显示任何信息)。 Snoop会以某种方式刷新绑定吗?

更新

似乎问题只发生在Button最初不可见时,例如放置在不可见的Expander og TabItem中。

1 个答案:

答案 0 :(得分:5)

Tabs和Expander控件通常不会创建和初始化项目,除非它们是可见的,只有在第一次显示它们时,才会创建项目并初始化,这就是第一次绑定可能失败的原因。当没有创建元素时,没有这种解决方案,因为它没有出现在可视化树中。

原因很简单,如果你有一个模板控件,控件模板就不会被创建,直到控件可见并添加到可视树中。由于这个原因,模板中的项目不存在且无法绑定,现在Tabs和Expander的子项等不会与父项一起创建。

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