【问题标题】:Debug ElementName binding调试 ElementName 绑定
【发布时间】:2011-06-09 09:09:21
【问题描述】:

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

我有一个相当复杂的问题,当元素名称绑定失败(未找到元素)时,它用于按钮上的 CommandParameter,该按钮是放置在 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 中选择按钮时,ElementName 绑定开始工作(但在 VS 输出窗口中不显示任何信息)。 Snoop 是否会以某种方式刷新绑定?

更新

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

【问题讨论】:

    标签: wpf data-binding


    【解决方案1】:

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

    原因很简单,如果你有一个模板化的控件,在控件可见并添加到可视化树之前,不会创建控件的模板。因为这个原因,template里面的item不存在也不能绑定,现在Tabs和Expander的child等都不会和parent一起创建。

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

    【讨论】:

    • 但是当我看到DataBinding调试信息的时候,是不是说明元素已经创建好了?而且我可以在 Snoop 中看到可视化树中的元素,但直到我选择了元素,情况才会发生变化。
    • 这就是 snoop 的管理方式,但是如果没有 snoop,我会在创建元素之前看到这样的绑定警告。我认为 WPF 正在创建可视化树,但初始化和应用模板可能会推迟到第一次激活。
    • 那么当按钮被“创建/初始化”时,有没有办法重新初始化绑定?
    • 如果按钮在 TabItem 或 Expanded 内,则根本不会创建,只有在 tabitem 或 expander 使其内容可见后,绑定才能正常工作。这就是为什么它只是警告,你必须忽略它。除了通过元素名称引用项目之外,您还可以尝试一些替代方法,方法是在模型中再添加一个属性,或者进行自定义控件并公开您需要的其他一些细节。
    • 这不是我问题的确切答案,但它为我指明了正确的方向。我通过将控件移动到 UserControl 上的 DataTemplate 解决了这个问题。
    猜你喜欢
    • 2012-02-25
    • 2012-10-12
    • 2012-07-14
    • 2015-09-02
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多