Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

MVVM avec un control créé à partir d'un resource dictionary


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    mai 2008
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : mai 2008
    Messages : 792
    Points : 826
    Points
    826
    Par défaut MVVM avec un control créé à partir d'un resource dictionary
    Bonjour,

    Je vais essayer d'être le plus clair possible dans mon explication.

    Je souhaite créer un "custom control" à partir d'un style hébergé dans un resource dictionary.
    -> fichier ToggleTextboxComment.xaml (de type bibliotèque de ressources)

    Dans celui ci se trouve une grosse balise style qui définie l'aspect de mon contrôle.
    En target type, j'ai mis v:ToggleTextboxComment (v pour le namespace view)

    Dans le namespace view, j'ai une déclaration de classe comme suis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class ToggleTextboxComment : ContentControl
        {
            ToggleTextboxCommentViewModel vm;
            public ToggleTextboxComment()
            {
                if (vm == null)
                    vm = new ToggleTextboxCommentViewModel();
                this.DataContext = vm;
            }
        }
    J'ai également le view model qui va bien dans le namespace viewmodel (vm):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     internal class ToggleTextboxCommentViewModel : G.U.Common.Ui.ViewModel.ViewModelBase<ToggleTextboxCommentViewModel>
        {
            private string _commentaire;
            private string _texteHint;
            private string _texteTextbox;
            private bool _actif;
     
            public string Commentaire
            {
                get => _commentaire;
                set
                {
                    Set(ref _commentaire, value);
                }
            }
     
            public string TexteHint
            {
                get => _texteHint;
                set
                {
                   Set(ref _texteHint, value);
                }
            }
     
            public string TexteTextbox
            {
                get => _texteTextbox;
                set
                {
                    Set(ref _texteTextbox, value);
                }
            }
            public bool Actif
            {
                get => _actif;
                set
                {
                    Set(ref _actif, value);
                }
            }
    }
    }
    La classe viewModelBase<T> dont hérite ToggleTextboxCommentViewModel est un outil mis en place au seins de mon équipe pour faciliter la gestion des propertychange etc etc qui lui même dérive de viewmodelbase proposé par galasoft.


    Rendu là, j'ai donc 3 éléments qui permettent de "définir" un contrôle au complet.

    Là où ça coince, c'est lorsque je souhaite utiliser ce contrôle depuis une page.

    Dans une page (Rapport.xaml):
    Dans les resources dictionnary, je déclare ça :
    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            <ResourceDictionary>
                <DataTemplate x:Key="controlDataTemplate" DataType="{x:Type vm:ToggleTextboxCommentViewModel}" >
                    <v:ToggleTextboxComment Style="{StaticResource styleToggleTextboxComment}"/>
                </DataTemplate>
            </ResourceDictionary>

    et ensuite dans la grid de ma page, j'utilise ce contrôle au seins d'une liste :
    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    <ListBox ItemsSource="{Binding ToggleElements}" ItemTemplate="{StaticResource controlDataTemplate}"/>

    La liste ToggleElements est instanciée dans RapportViewModel comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     private ObservableCollection<ToggleTextboxCommentViewModel> _toggleElements = new ObservableCollection<ToggleTextboxCommentViewModel>();
            public IEnumerable<ToggleTextboxCommentViewModel> ToggleElements => _toggleElements;
     public RapportViewModel()
            {
                ToggleTextboxComment tgc = new ToggleTextboxComment();
                _toggleElements.Add(new ToggleTextboxCommentViewModel("un commentaire", "", "", true));
            }
    Le problème qui se pose, c'est que lorsque le contrôle s'affiche, il ne reflète pas les données saisies...
    j'ai le bon compte, si je rajoute un autre toggleTextboxComment pour le Add, j'aurais bien 2 contrôle affiché, mais le toggle button qui devrait être sur la position true, reste a false et le commentaire ne contient rien.

    Je bloque sur ce problème depuis un certain temps et je tourne en rond.
    Peut être qu'une bonne âme aurait une solution pour mon problème.

    A vot' bon coeur !!
    - La dernière fois que j'ai testé ca fonctionnait !
    - Vous n'avez rien modifié ?
    - Non ! Je suis pas idiot non plus.
    - ....
    - Enfin si, juste le fichier .dll, mais a 4Ko, ca devait pas être important.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    juillet 2008
    Messages
    1 453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2008
    Messages : 1 453
    Points : 1 278
    Points
    1 278
    Par défaut
    bon deja ta demande est resolue ..
    est ce vraiment le cas ?

    sinon on va proceder plus basiquement
    1 - creation d'un custom control
    le style est hebergé dans generic.xaml

    maintenant ton custom control a besoin de quoi comme DP ?
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!

  3. #3
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    mai 2008
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : mai 2008
    Messages : 792
    Points : 826
    Points
    826
    Par défaut
    bonjour,

    ma problématique est effectivement résolue.

    Le problème venait du type ciblé par le style.
    Je visais une vue (TargetType="{x:Type v:ToggleTextboxComment}", a tord.
    J'ai mis le TargetType="{x:Type ContentControl}".

    Ainsi, dans mes pages et window, lorsque je veux rajouter mon composant, je déclare une balise <ContentControl .... /> en lui affectant un DataContext sur une propriété issue du VM rattaché à la page.

    Egalement, lorsque je veux utiliser ces composants dans des listbox, dans le DataTemplate, je vise un DataType ContentControl (et non le viewModel)

    C'était un problème de compréhension sur les type des composants que je manipulais.
    - La dernière fois que j'ai testé ca fonctionnait !
    - Vous n'avez rien modifié ?
    - Non ! Je suis pas idiot non plus.
    - ....
    - Enfin si, juste le fichier .dll, mais a 4Ko, ca devait pas être important.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. MVVM avec périphérique de controle
    Par Oberown dans le forum Architecture
    Réponses: 2
    Dernier message: 27/05/2011, 14h36
  2. la valeur d'un controle a partir de BindingManager
    Par Amri_Daly dans le forum Framework .NET
    Réponses: 1
    Dernier message: 23/12/2005, 18h15
  3. [VBA]envoyer un email avec un fichier joint à partir d'excel
    Par mcay dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 21/12/2005, 10h21
  4. PB avec le controle CMonthCalCtrl !
    Par chaser_T dans le forum MFC
    Réponses: 1
    Dernier message: 07/11/2005, 11h08
  5. [C#] problem avec repeater control
    Par moniphal dans le forum ASP.NET
    Réponses: 13
    Dernier message: 27/04/2005, 09h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo