微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将TextBox绑定到从其他Thread更新的值

如何解决将TextBox绑定到从其他Thread更新的值

|| 只要按下按钮,我就尝试增加一个值。增量值通过绑定到TextBox进行连接。更新底层整数时会发生问题。我得到另一个线程拥有它的异常。
    <Button Name=\"Up\"
            Content=\"Up\"
            PreviewMouseLeftButtonDown=\"Up_PreviewMouseLeftButtonDown\"
            PreviewMouseLeftButtonUp=\"Up_PreviewMouseLeftButtonUp\">
    </Button>
    <TextBox Text=\"{Binding NumericField}\">
初始化期间:
Timer = New Timers.Timer
Timer.Interval = 100
AddHandler Timer.Elapsed,AddressOf Timer_Elapsed
后面的代码
  Private _numericField As Integer
  Public Property NumericField As Integer
    Get
      Return _numericField
    End Get
    Set(ByVal value As Integer)
      _numericField = value
      RaiseEvent PropertyChanged(Me,New ComponentModel.PropertyChangedEventArgs(\"NumericField\"))
    End Set
  End Property

  Private Sub Timer_Elapsed(ByVal sender As Object,ByVal e As System.Timers.ElapsedEventArgs)
    NumericField += 1
  End Sub

  Private Sub Up_PreviewMouseLeftButtonDown(ByVal sender As System.Object,ByVal e As System.Windows.Input.MouseButtonEventArgs)
    Timer.Start()
  End Sub

  Private Sub Up_PreviewMouseLeftButtonUp(ByVal sender As System.Object,ByVal e As System.Windows.Input.MouseButtonEventArgs)
    Timer.Stop()
  End Sub

解决方法

这看起来有点太复杂了。您不能使用RepeatButton吗? 简单的解决方案:
<RepeatButton Click=\"RepeatButton_Click\" Content=\"Up\" />
后面的代码:
  Private Sub RepeatButton_Click(ByVal sender As System.Object,ByVal e As System.Windows.RoutedEventArgs)
    NumericField += 1
  End Sub
使用命令 尽量避免在文件后面的代码中使用不必要的代码。这是使用命令的草图 XAML:
<RepeatButton Command=\"{Binding IncrementField}\" Content=\"Up\"></RepeatButton>
帮助类。可重用于项目中的所有命令:
Public Class ActionCommand
  Implements ICommand

  Private ReadOnly _executeHandler As Action(Of Object)
  Private ReadOnly _canExecuteHandler As Func(Of Object,Boolean)

  Public Sub New(ByVal execute As Action(Of Object),ByVal canExecute As Func(Of Object,Boolean))
    If execute Is Nothing Then
      Throw New ArgumentNullException(\"Execute cannot be null\")
    End If
    _executeHandler = execute
    _canExecuteHandler = canExecute
  End Sub

  Public Custom Event CanExecuteChanged As EventHandler Implements ICommand.CanExecuteChanged
    AddHandler(ByVal value As EventHandler)
      AddHandler CommandManager.RequerySuggested,value
    End AddHandler

    RemoveHandler(ByVal value As EventHandler)
      RemoveHandler CommandManager.RequerySuggested,value
    End RemoveHandler

    RaiseEvent(ByVal sender As Object,ByVal e As System.EventArgs)
      CommandManager.InvalidateRequerySuggested()
    End RaiseEvent
  End Event

  Public Sub Execute(ByVal parameter As Object) Implements ICommand.Execute
    _executeHandler(parameter)
  End Sub

  Public Function CanExecute(ByVal parameter As Object) As Boolean Implements ICommand.CanExecute
    If (_canExecuteHandler Is Nothing) Then
      Return True
    End If
    Return _canExecuteHandler(parameter)
  End Function
End Class
在您的模型中:
_incrementField = New ActionCommand(AddressOf IncrementExecuted,AddressOf IncrementCanExecute)
...
  Private Function IncrementCanExecute(ByVal parameter As Object) As Boolean
    Return True
  End Function

  Private Sub IncrementExecuted(ByVal parameter As Object)
    NumericField += 1
  End Sub

  Private _incrementField As ActionCommand
  Public ReadOnly Property IncrementField As ActionCommand
    Get
      Return _incrementField
    End Get
  End Property

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。