Ich habe ein Fenster mit einem TextBlock innerhalb erstellt. Ich habe die Text-Eigenschaft gebunden und alles funktioniert einwandfrei. ABER Wenn ich die beschränkte Eigenschaft innerhalb einer Aufgabe ändern, dann funktioniert nichts !!Binding und Async-Operationen
Wissen Sie warum?
Public Async Sub StartProgress()
Try
LoadingText = "text 1" 'Works perfect
Dim fResult As Boolean = Await LoadModules()
If Not fResult Then
MessageBox.Show(Me.Error)
End If
m_oView.Close()
Catch ex As Exception
Msg_Err(ex)
End Try
End Sub
Public Async Function LoadModules() As Task(Of Boolean)
Try
Await Task.Delay(3000)
LoadingText = "text 2" 'Nothing Happens
Await Task.Delay(5000)
LoadingText = "complete" 'Nothing Happens
Await Task.Delay(3000)
Return True
Catch ex As Exception
Me.Error = ex.Message
Return False
End Try
End Function
Text 2 und 3 werden nie angezeigt. Wenn ich dynamisch den Text des textblcok (ex: m_oView.txtLoadingText.Text) ändern fein Es funktioniert (aber es ist mnot eine Lösung)
EDIT Dies ist die Ansichtsmodell Base, implementiert jede Ansichtsmodell dieser Klasse.
Public Class VM_Base
Implements IDisposable
Implements INotifyPropertyChanged
Private m_oDS As MxDataSet
Public Property [Error] As String
Public Event PropertyChanged As PropertyChangedEventHandler _
Implements INotifyPropertyChanged.PropertyChanged
Protected Sub New()
m_oDS = New MxDataSet
End Sub
Protected Overrides Sub Finalize()
Try
Me.Dispose(False)
Debug.Fail("Dispose not called on ViewModel class.")
Finally
MyBase.Finalize()
End Try
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
Me.Dispose(True)
GC.SuppressFinalize(Me)
End Sub
Protected Overridable Sub Dispose(disposing As Boolean)
End Sub
Protected Overridable Sub OnPropertyChanged(propertyName As String)
Me.EnsureProperty(propertyName)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub
<Conditional("DEBUG")> _
Private Sub EnsureProperty(propertyName As String)
If TypeDescriptor.GetProperties(Me)(propertyName) Is Nothing Then
Throw New ArgumentException("Property does not exist.", "propertyName")
End If
End Sub
End Class
Wie StartProgress heißt:
<i:Interaction.Triggers>
<i:EventTrigger EventName="ContentRendered">
<i:InvokeCommandAction Command="{Binding DataContext.WindowsActivatedCommand,ElementName=fLoading}" />
</i:EventTrigger>
</i:Interaction.Triggers>
EDIT Binding TextBlock- zum Objekt
Public Property LoadingText As String
Get
Return m_sLoadingText
End Get
Set(value As String)
m_sLoadingText = value
OnPropertyChanged("LoadingText")
End Set
End Property
<TextBlock x:Name="txtLoading" Width="450"
Grid.Row="1" VerticalAlignment="Center"
HorizontalAlignment="Left"
TextWrapping="Wrap" Text="{Binding LoadingText}">
</TextBlock>
Ich habe keine Fehler, wenn ich versuche, die Text-Eigenschaft festlegen. Außerdem verwende ich Task, weder Dispatcher noch BackgroundWorker, um auf das Aufrufen der Benutzeroberfläche zu achten. Auch wenn ich TextBlock erzwinge, den Text zum Beispiel m_oView.txtLoadingText.Text = "etwas" zu ändern, dann ändert es sich !! –