2010-10-08 7 views
0

J'ai une application WPF avec un formulaire qui a une zone de texte nommée "txtStatusWindow". J'ai également une classe vb.net qui m'a été remise par un collègue qui doit être appelée et exécutée par le code dans mon application code-behind. Mon collègue insiste sur le fait que j'aurai besoin d'utiliser les événements .net courants pour mettre à jour la zone de texte sur mon formulaire.WPF et VB.net: liaison de données pour séparer la classe créée en dehors du mélange d'expression

La classe vb.net séparée:

Public Class globalclass 

Public Event txtStatusWindow(ByVal Text As String) 


Public Sub InitializeProgram() 
    RaiseEvent txtStatusWindow("Updating something.") 
    System.Threading.Thread.Sleep(2000) 
    RaiseEvent txtStatusWindow("Updating something else.") 
    System.Threading.Thread.Sleep(2000) 
    RaiseEvent txtStatusWindow("Updating something other than else.") 
    System.Threading.Thread.Sleep(2000) 
    RaiseEvent txtStatusWindow("Updating something other than the else stuff.") 
    System.Threading.Thread.Sleep(2000) 
End Sub 

End Class 

Je dois être en mesure d'appeler le sous « InitializeProgram() » de mon code-behind, et il doit être en mesure de mettre à jour « txtStatusWindow.text "comme il fonctionne. Je lui ai dit que la mise à jour de la zone de texte peut être faite avec la liaison de données, mais je ne sais pas comment intégrer une classe séparée comme ça dans mon projet, comment appeler des méthodes, ou comment provoque la mise à jour de mes blocs de texte via la liaison de données. J'ai également suggéré que les méthodes de cette classe ne sont pas optimales pour se connecter au projet WPF de toute façon, mais il l'a juste écrit comme un exemple pour découvrir comment connecter les deux projets. Par la suite, j'aurai besoin d'intégrer des classes comme celles-ci qui exécuteront des threads séparés pour mettre à jour leurs données à partir d'une source dynamique et provoquer la mise à jour de nombreux contrôles dans mon application.

Jusqu'à présent, la seule façon que nous avons pu obtenir ce travail à partir du code-behind mon est ceci:

Partial Public Class SplashScreen 

Dim NewText as String 

    Public WithEvents Globals As globalclass = New globalclass 
    Public Delegate Sub StringDelegate(ByVal Text As String) 
    Public SplashText As String 

Public Sub New() 
    MyBase.New() 
    Me.InitializeComponent() 
    Me.Show() 
    Globals.InitializeProgram() 

End Sub 

Public Sub UpdateSplashscreenHandler(ByVal Text As String) Handles Globals.UpdateSplashScreen 

    StatusWindowText.Text = Text 

End Sub 

Malgré le fait que l'écran WPF « fige » jusqu'à ce que le « globalclass InitializeProgram » method completes (txtStatusWindow.Text ne se met pas à jour pendant que sub sans utiliser l'extension "refresh" ésotérique ...), je crois sincèrement que nous allons dans ce sens.

Il y a quelques exemples précieux concernant l'intégration et la liaison aux objets dans le code existant. Merci d'avoir examiné notre petit problème.

+0

Voulez-vous dire qu'il n'y a pas de XAML impliqué et que vous créez toute l'interface utilisateur directement à partir de VB? – MojoFilter

Répondre

0

Si cette fenêtre d'état est en mode XAML et que la fenêtre d'état est un UserControl, ajoutez une propriété de dépendance StatusText à la fenêtre d'état. Ensuite, dans le XAML, vous pouvez lier à la valeur de cette propriété avec quelque chose comme:

<UserControl x:Name="MyStatusWindow" ...> 
    <TextBlock Text="{Binding Path=StatusText, ElementName=MyStatusWindow}" /> 
</UserControl> 

Puis, à partir de votre événement, simplement mettre à jour la valeur de cette propriété StatusText.

(Est-ce que, même à ce que vous demandiez?)

En outre, sur ce gel: Au lieu de le faire la mise à jour dans le constructeur de cette classe, vous pouvez le faire de l'événement Loaded de cette contrôle. Cependant, il gèlera encore, à moins que vous ne le déplaciez dans un fil séparé. À l'heure actuelle, cela se produit sur le même thread que celui sur lequel s'exécute la pompe de messagerie de l'interface utilisateur. C'est le Dispatcher pour cette interface utilisateur.

+0

L'objet "StatusWindowText" est juste une zone de texte commune, donc il a une propriété de dépendance. La raison pour laquelle la routine échoue est la façon dont nous appelons le sous-classe dans la classe "globalclass". Le sous-marin ne mettrait pas à jour le formulaire d'appel "SplashScreen" car nous envoyions tous les événements de la sous-routine. Lorsque nous avons décomposé les événements en une instruction Select Case et que nous l'avons pilotée avec un dispatchertimer, la zone de texte a été mise à jour correctement. Donc, il s'avère que MojoFilter est correct! Merci! – MBunds

Questions connexes