【发布时间】: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属性,默认值为LostFocus:msdn.microsoft.com/de-de/library/… -
我试试看。但这不是只适用于 TwoWay 绑定吗??
-
不,它适用于每个绑定!正如@DanielHilgarth 所说,
Text绑定的默认UpdateSourceTrigger是LostFocus,因此绑定肯定不会在每次更改绑定属性时自行更新
标签: wpf data-binding user-controls ado.net