Привязка TextBox к значению, которое обновляется из другого потока - PullRequest
0 голосов
/ 20 апреля 2011

Я пытался увеличивать значение, пока я нажимаю кнопку.Увеличенное значение связано через привязку к 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

1 Ответ

2 голосов
/ 20 апреля 2011

Это выглядит слишком сложно.Не можете ли вы использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...