WPF liaison de plusieurs commandes à d'autres datacontexts
J'ai un scénario où je ne sais pas vraiment comment lier des données à des contrôles hébergé dans un UserControl à plusieurs datacontexts.
Les données que je veux lier vient de 2 classes
UserInfo, UserExtendedInfo
Le datacontext de l'objet UserControl est la valeur UserInfo afin que je puisse lier la plupart des commandes facilement procédant de la manière suivante
<Label Name="LblEmail" Text="{Binding Email}" />
Cependant je ne sais pas comment lier les propriétés de la UserExtendedInfo classe facilement. Ma première pensée a été de définir le datacontext de chaque contrôle qui veulent à utiliser les données de UserExtendedInfo afin que je puisse faire de même. Mais ce qui semble lourd que je dois attribuer manuellement chacun indivdually. Les données pour UserExtendedInfo doivent être récupérées à partir de la base de données chaque fois que le UserControl devient visible, afin de ne pas sortir de la synchronisation.
XAML:
<Label Name="LblTest" Text="{Binding Locale}" />
Code Derrière:
Private Sub UserManager_IsVisibleChanged(ByVal sender As System.Object, ByVal e As System.Windows.DependencyPropertyChangedEventArgs)
If DirectCast(e.NewValue, Boolean) Then
Dim user As UserInfo = DirectCast(DataContext, UserInfo)
If user IsNot Nothing Then
Dim usrExt As UserExtenedInfo = UserController.GetUserExtended(user.userID)
LblTest.DataContext = usrExt
Else
Throw New ArgumentException("UserId doesn't exist or is less than 1")
End If
End If
End Sub
Vous devez vous connecter pour publier un commentaire.
J'aurais peut-être penser à d'emballage de votre objet utilisateur dans une salle de classe, puis en réglant le DataContext propriétés des sous-panneaux qui contiennent les données.
Par exemple:
Puis dans votre UserControl.xaml:
Cela suppose que votre UserInfo de classe a d'une propriété de e-Mail
et
Que votre UserExtendedInfo de classe a d'une propriété de Locale et AboutMe
Ici est la méthode la plus simple de tous, et il fonctionne très bien.
Dans le code-behind où vous définissez le contexte, il suffit d'utiliser un type anonyme contenant toutes les valeurs souhaitées:
Dans le XAML, vous pouvez lier à rien:
Sinon, vous pouvez lier à deux niveaux, comme d'autres réponses ont décrit:
C'est là que M-V-VM est très pratique. L'idée (ce que je comprends au moins...encore très nouveau pour moi) c'est que la Fenêtre elle-même est lié à un "ViewModel" de la classe. La classe ViewModel est juste une classe qui représente toutes les données de manière à ce que votre page entière a accès à tout ce dont il a besoin...simplement, il rassemble tous les différents objets que vous aurez besoin de lier dans une même classe...et vous définissez le DataContext de la Fenêtre (ou de la Page) à une instance de cette classe. Votre UserInfo et UserInfoExtended les instances sont des propriétés publiques de la ViewModel objet, et il vous suffit d'utiliser le Chemin d'accès de votre élément de liaison pour vous, par l'intermédiaire des propriétés de l'objet que vous souhaitez lier chaque commande.
Il y a un grand (mais assez longue) vidéo expliquant ce modèle, et il va par le biais d'un exemple complet qui illustre de nombreuses façons d'accomplir cela et beaucoup de différentes raisons pour lesquelles c'est un moyen pratique et évolutive modèle à utiliser dans une application WPF. Il couvre également de nombreuses fonctionnalités de WPF ainsi qu'une introduction à l'injection de dépendance, qui sont très sujets pertinents ainsi, compte tenu de l'exemple.
Voici un lien vers le blog qui contient un lien vers la vidéo je parle de:
MODIFIER: Blog post a été supprimé (cette réponse est assez ancien). Voici la vidéo sur YouTube:
https://www.youtube.com/watch?v=BRxnZahCPFQ
À la fois Riche et bendewey avait de bonnes réponses. L'exploration de cette même sujet aujourd'hui dans Silverlight au lieu de WPF, j'ai trouvé qu'il n'est pas nécessaire d'établir de multiples DataContexts. La révision de bendewey exemple:
En utilisant le Chemin de Liaison, vous gagnez la possibilité de combiner les liaisons aux propriétés des différentes classes sans souci pour le DataContext de la de contrôle des conteneurs.
Vous pouvez également étendre les capacités de bendewey de UserDataContext classe par l'ajout de propriétés de manipuler des propriétés de la UserInfo et UserExtendedInfo classes. Vous pourriez, par exemple, de combiner de nom et de prénom.
Vous voudrez peut-être implémenter INotifyPropertyChanged, de sorte que votre mise à jour des commandes lorsque vous réinitialisez UserInfo et UserExtendedInfo.
Il peut être préférable à l'architecture tout à fait d'isoler le sous-jacent UserInfo et UserExtendedInfo classes à partir de la XAML en exposant les propriétés requises directement dans UserDataContext, éliminant ainsi la nécessité de Chemin de Liaison.