MVVM + UserControl + Dépendance de la Propriété
Bon, c'est en quelque sorte liée à cette question: WPF l'Impression de plusieurs pages à partir d'un seul Modèle de Vue
J'ai essayé de suivre les conseils donnés, mais maintenant je suis coincé.
Mon application utilise un MainView.xaml et le MainViewViewModel.cs, je suis en utilisant MVVM Light en arrière-plan.
Maintenant - selon le post - it semble que j'ai de faire ce qui suit:
- Créer un contrôle utilisateur
- Exposer certaines propriétés de l'utilisateur contrôle
- Assurez-vous que le modèle de vue montre ces propriétés
L'idée est claire, mais je suis coincé lorsque vous essayez d'en informer les uns les autres.
Mon contrôle de l'utilisateur (UcTest.xaml) expose une Propriété de Dépendance:
public string SpecialText
{
get { return (string)GetValue(SpecialTextProperty); }
set
{
SetValue(SpecialTextProperty, value);
}
}
//Using a DependencyProperty as the backing store for SpecialText. This enables animation, styling, binding, etc...
public static readonly DependencyProperty SpecialTextProperty =
DependencyProperty.Register("SpecialText", typeof(string), typeof(UcTest), new PropertyMetadata(new PropertyChangedCallback(SpecialTextChangedPropertyCallback)));
private static void SpecialTextChangedPropertyCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
//Do something
Debug.WriteLine("Ffgdgf");
}
Bon, alors je le fais maintenant avoir un contrôle utilisateur qui possède certaines propriétés de dépendance. Pourtant, ces propriétés sont complètement séparée de mon ViewModel propriétés (ce sont ceux qui doivent être affichés).
Donc en gros, j'ai deux possibilités:
- Comment puis-je maintenant dire à mon ViewModel pour le contrôle UserControl que certaines propriétés ont changé?
- Est-il possible d'oublier les propriétés de dépendance et d'accéder à la vue du modèle directement?
Plus d'infos #1:
J'ai téléchargé une (simple) exemple de ce que je suis en train de faire ici: Exemple De Projet. Je voudrais changer la valeur de l'étiquette dans UserControl1 (par l'intermédiaire de la liaison de la propriété du ViewModel pour UserControl1) de mon MainViewViewModel.
Cela voudrait dire que mon UserControl aurait besoin d'implémenter INotifyPropertyChanged qui est essentiellement ce que mon ViewModel devrait le faire.
OriginalL'auteur Tom L. | 2013-03-02
Vous devez vous connecter pour publier un commentaire.
Vous aurait généralement lier de l'objet UserControl propriété du ViewModel de la propriété. Une liaison bidirectionnelle serait de travailler dans les deux directions, à partir de ViewModel pour Afficher et vice versa.
Pour accéder directement au Dernier objet dans l'exemple ci-dessus, vous pouvez tout simplement jeté l'objet UserControl
DataContext
propriété du ViewModel type. Le DataContext est héritée de la MainWindow.Vous pouvez bien sûr également affecter directement une spécialisée ViewModel instance de l'objet UserControl
DataContext
:ou vous pouvez créer le ViewModel instance comme une ressource dans un dictionnaire de ressources et d'attribuer le DataContext comme ce
Cela dépend de votre conception de l'application. Les deux sont valables solution. Vous pouvez tout aussi bien affecter directement l'objet UserControl DataContext de la propriété.
Hm, non .. je ne comprends pas vraiment ce. Pourriez-vous poster un exemple? Parce que dès que je change le DataContext pour le UserControl à la UserControlViewModel je ne peut pas l'affecter plus de variables que l'UserControl ne sais pas à propos de ces propriétés. Comment puis-je attribuer quelque chose à "SpecialText" si SpecialText est pas DependencyProperty?
Voir mon edit. Que voulez-vous dire par "comment puis-je attribuer quelque chose à "SpecialText" si SpecialText est pas DependencyProperty?". SpecialText est une propriété de dépendance, vous l'avez conçu de cette façon.
Oui (oh c'est si dur à expliquer). le point principal est que la Propriété de Dépendance "Texte" est découplé du ViewModel. J'ai téléchargé un petit exemple (lien dans mon poste principal), peut-être à démontrer ce que je veux dire.
OriginalL'auteur Clemens
Bon, après des heures de recherche sur google, il semble que la "bonne" approche c'est de ne pas le faire du tout. L'approche générale est de conserver les données dans votre MainViewModel et de ne pas utiliser un ViewModel pour le contrôle UserControl (que je trouve un peu ... eh bien ... pas très bon). Le principal problème est qu'il n'existe pas de mécanisme simple permettant d'obtenir les Données de la Dépendance de la Propriété du ViewModel.
Pour l'impression, j'ai repris le faire purement dans le code.
L. dans votre situation, le meilleur que j'ai été en mesure de venir avec est de ne pas définir un contexte de données dans le contrôle de l'utilisateur, puis sur windows charge de sauver le passé propriétés de la DP pour les variables, puis de définir le contexte d'une nouvelle instance de votre VM. Puis sélectionnez propriétés dans le VM et continuer sur. Ce n'est pas idéal, mais il ne obtenir le travail fait. Je souhaite que dans les métadonnées de la DP, vous pouvez spécifier dans quel contexte afin d'obtenir les liaisons.
OriginalL'auteur Tom L.