2011-04-20 66 views
0

只要按下按鈕,我就嘗試增加一個值。遞增的值通過綁定連接到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 

回答

2

這看起來有點太複雜了。你不能使用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 
+0

你的第一個解決方案工作正常,我 – Origrim 2011-04-20 06:45:42