【问题标题】:Suspend updates to control from binding in WPF暂停更新以控制 WPF 中的绑定
【发布时间】:2014-10-14 19:57:34
【问题描述】:

我正在尝试找到一种方法来暂停对TextBox 控件的更新,当它具有焦点时,它仍然能够在用户按下 Enter 键时使用UpdateSource() 更新源。一些solutions 建议暂停源触发PropertyChangedEvent,但在我的情况下,值绑定到多个控件,我不想暂停它们的更新。 其他一些人也建议从控件中删除绑定,但这会重置TextBox 的值(我希望Text 属性保持不变),当我再次设置绑定时,它也会首先发送FallbackValue,因为设置了绑定也清除了财产的价值。

WinForms我已经通过以下代码完成了这个场景:

Public Class BindingTextBox
    Inherits TextBox

Private Sub BindingTextBox_Enter(sender As Object, e As System.EventArgs) Handles Me.Enter
    Me.DataBindings.Item("Text").ControlUpdateMode = ControlUpdateMode.Never
End Sub
Private Sub BindingTextBox_Leave(sender As Object, e As System.EventArgs) Handles Me.Leave
    Me.DataBindings.Item("Text").ControlUpdateMode = ControlUpdateMode.OnPropertyChanged
End Sub
Private Sub BindingTextBox_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    Select Case e.KeyCode
        Case Keys.Enter
            Me.DataBindings.Item("Text").WriteValue()
        Case Keys.Escape
            Me.DataBindings.Item("Text").ReadValue()
    End Select
End Sub

End Class

如何在 WPF 中重新创建此功能?

编辑

也许我不清楚。我的目标是进行双向绑定,对源进行显式更新,并在控制获得焦点时从源“暂停”更新。

【问题讨论】:

  • 您可以尝试将BindingUpdateSourceTrigger 设置为UpdateSourceTrigger.Explicit 并使用BindingExpression 使用UpdateSource() 方法手动更新。
  • 更新源不是问题,我已经做到了。我的问题是停止从源更新,但可以使用UpdateSource() 将其更新为源
  • 尝试将Binding的Mode设置为OneWayToSource

标签: .net wpf vb.net data-binding


【解决方案1】:

试试这个,但我不确定它是否满足需求。如果发生焦点,它将根据您放入文本框中的文本更新您的属性。

<TextBox>
        <TextBox.Style>
            <Style TargetType="TextBox">
                <Setter Property="Text" Value="{Binding Zmienna, Mode=OneWay}"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsFocused}" Value="True">
                        <Setter Property="Text" Value="{Binding Zmienna, Mode=OneWayToSource}"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>

【讨论】:

  • 不,那不是我的目标。我的目标是仅在用户按 Enter 时将绑定应用到源,并暂停更新至 TextBox FROM 源。
  • 为了停止来自源文本框的更新,您可以使用 Mode=OneTime(仅在应用程序启动时检索数据)。然后如果按下回车,则在代码中更新。
  • 我想一直检索更新(数据大约每秒更改一次),只是在TextBox 获得焦点时“暂停”它。
  • 首先你告诉过你要暂停更新,现在你想一直检索,下定决心。
  • 我希望控件一直更新,但是当控件有焦点时应该暂停更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 2011-06-25
  • 1970-01-01
  • 2011-01-11
  • 2013-05-13
  • 1970-01-01
  • 2013-09-01
相关资源
最近更新 更多