【问题标题】:What can cause WPF binding to break (using ADO.net)?什么会导致 WPF 绑定中断(使用 ADO.net)?
【发布时间】:2012-08-16 16:09:28
【问题描述】:

我在这个问题上已经 3 天了,我没有选择。不知道还能做什么。我有一个带有 TextBoxes 的 UserControl,所有这些都类似地定义:

<TextBox x:Name="txtFreeFormat" Grid.Row="0" Grid.Column="1" TextWrapping="Wrap"
                     KeyUp="txtFreeFormat_KeyUp" PreviewKeyDown="txtFreeFormat_PreviewKeyDown" TextChanged="txtFreeFormat_TextChanged"
                     Text="{Binding [FREEFORMATADDRESSUI], Mode=OneWay, Converter={StaticResource FreeFormatOnlyConverter}, diag:PresentationTraceSources.TraceLevel=High}"
                     IsEnabled="{Binding Path=IsLocationEnabled, ElementName=LocationUserControl}"
                     IsReadOnly="{Binding Path=IsReadOnly, ElementName=LocationUserControl}"/>

此文本框存在于 WPF 用户控件中,该用户控件存在于 Win32 应用程序的 ElementHost 中。

我将 WPF UserControl 的 DataContext 设置为 DataView。我基本上希望数据在 DataView 中更新时随时更新,反之亦然,因此我有一个 OneWay 绑定。

允许用户输入,但在用户输入时我不执行任何明确的源更新。

我奇怪的问题是应用程序中的某些地方,这个控件工作正常,绑定是完美的。应用程序中的其他地方,当 DataView 更新其数据时,WPF UserControls 的 UI 不会更新。我到处都有痕迹,并且没有绑定错误。因此 WPF UserControls 的 DataContext 是最新的,但 UI 并未反映这些更改。

我还能寻找什么?什么会导致绑定与 DataView 断开连接?

谢谢!!!

更新:

我不敢相信在使用大马士革指定的更改后它仍然无法正常工作。我什至在 DataView 更新后调用我自己的函数来重置绑定:

Public Sub RefreshBinding()
    If WPFUserControl IsNot Nothing AndAlso WPFUserControl.DataContext IsNot Nothing Then
        Dim dv As DataView = WPFUserControl.DataContext
        WPFUserControl.DataContext = Nothing
        WPFUserControl.DataContext = dv
    End If
End Sub

我注意到此时转换器不再触发。当 DataContext = Nothing 时,字段也不清除。

你现在可以明白我为什么坚持了 3 天了 :(

更新 2:

注意到一些新的东西......我们正在取得进展。一旦我在文本框中键入,绑定似乎分离,我在输出窗口中收到此警告:

BindingExpression (hash=31836339):分离

所以我已将我的 TextBox 恢复为双向绑定,并为 UpdateSourceTrigger 提供显式模式。这已经停止了该警告,但我的行为仍然很奇怪。

这里全部解释: http://social.msdn.microsoft.com/forums/en-US/wpf/thread/3d092257-f5a9-4dc5-b9ee-ac1f0538df71/

【问题讨论】:

  • 您是否确认 DataView 会在数据更改时引发其 PropertyChanged 事件?
  • 您是否尝试将UpdateSourceTrigger 添加到您的文本绑定中> 它应该如下:Text="{Binding [FREEFORMATADDRESSUI], Mode=OneWay, Converter={StaticResource FreeFormatOnlyConverter}, diag:PresentationTraceSources.TraceLevel=High, UpdateSourceTrigger=PropertyChanged}"。这将强制每次更新属性时更新 UI(并要求您的属性触发 PropertyChanged 事件
  • @Damascus:不错,这确实可能是问题所在,特别是对于 Text 属性,默认值为 LostFocusmsdn.microsoft.com/de-de/library/…
  • 我试试看。但这不是只适用于 TwoWay 绑定吗??
  • 不,它适用于每个绑定!正如@DanielHilgarth 所说,Text 绑定的默认 UpdateSourceTriggerLostFocus ,因此绑定肯定不会在每次更改绑定属性时自行更新

标签: wpf data-binding user-controls ado.net


【解决方案1】:

所以最后,我还没有找到解决办法。相反,我决定监听 DataView 的DataTableColumnChanged 事件,并在目标TextBox 控件上调用相应的BindingExpression.UpdateTarget()。这对我有用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-26
    • 2021-12-14
    • 2011-01-14
    • 1970-01-01
    • 2011-03-22
    • 2010-09-18
    • 2015-05-31
    • 2012-03-06
    相关资源
    最近更新 更多