IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Silverlight Discussion :

Binding de UserControl.Content via un Converter


Sujet :

Silverlight

  1. #1
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut Binding de UserControl.Content via un Converter
    Hello tout le monde

    J'ai disons 3 views appelées view1, view2 et view3.

    Dans ma MainView, je souhaite avoir l'une des 3 vues suivant une valeur de mon ViewModel.

    J'ai donc bindé le Content de mon UserControl sur cette valeur via un converter.

    En gros, cela donne pour le xaml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        <toolbox:DiView.Resources>
            <help:SimulationParametersViewConverter x:Key="resSimulationParametersViewConveter" />
        </toolbox:DiView.Resources>
     
        <Grid Height="auto" Width="auto" x:Name="UiMainLayout" DataContext="{Binding View, Source={StaticResource resViewLocator}}">
             <UserControl x:Name="SimulationParametersView" Content="{Binding ViewModel.PricingTask.PayoffID, Converter={StaticResource 
        </Grid>
    Et pour le converter:

    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
    public class SimulationParametersViewConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Int16 payoffID;
     
            if (value == null)
                return null;
     
            if (!Int16.TryParse(value.ToString(), out payoffID))
                return null;
     
            switch (payoffID)
            {
                case 1:     // sweet reverse
                    return new Views.View1();
                case 14:    // autocall
                    return new Views.View2();
                case 23:    // reverse convertible
                    return new Views.View3();
                default:
                    throw new ArgumentException("The current PayoffID doesn't exist");
                    break;
            }
        }
    }
    Cela fonctionne comme je veux sauf que les differentes vues 1, 2 ou 3 ne sont pas détruites quand je switch de l'une à l'autre et ça me pose des problèmes de validation.

    Comment faire pour réinitialiser le Content de mon UserControl entre chaque switch???

    Merci

  2. #2
    Membre actif Avatar de freezer08
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 59
    Par défaut
    Tu pourrais également avoir un ContentControl dont le Content est directement bindé à une propriété de ton ViewModel représentant la vue à afficher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <ContentControl Content="{Binding SimulationParametersView}" />
    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
     
    public class MonViewModel 
    {
            private IView _simulationParametersView;
            public IView SimulationParametersView
            {
                get { return _simulationParametersView; }
                set
                {
                    if (_simulationParametersView != value)
                    {
                        _simulationParametersView = value;
                        RaisePropertyChanged("SimulationParametersView");
                    }
                }
            }
     
            void PayoffIdChanged()
            {
               SimulationParametersView = null;
     
               switch (payoffID)
               {
                case 1:     // sweet reverse
                    SimulationParametersView = new Views.View1();
                case 14:    // autocall
                    SimulationParametersView = new Views.View2();
                case 23:    // reverse convertible
                    SimulationParametersView = new Views.View3();
                default:
                    throw new ArgumentException("The current PayoffID doesn't exist");
                    break;
              }
            }
    }
    Ce n'est pas forcément très élégant, mais j'ai tendance à privilégier le ViewModel plutôt que des Converters pour tout ce qui est purement business.

  3. #3
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Why not. Mais ça va régler mon problème de "persistance" en mémoire des différentes vues?

  4. #4
    Membre actif Avatar de freezer08
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 59
    Par défaut
    Si ta vue n'est plus référencée nulle part, ni rattachée à l'arborescence visuelle, il n'y a pas de raison qu'elle reste en mémoire.

    Qu'est-ce qui te fait dire que ta vue n'est pas détruite ? Tu as fait du profiling ?
    Ca peut prendre un peu de temps avant que la mémoire soit collectée, mais si tu veux être sûr, tu peux vérifier avec WinDbg :
    http://blogs.msdn.com/b/sbovo/archiv...tpossible.aspx
    http://weblogs.asp.net/pglavich/arch...ng-windbg.aspx

  5. #5
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Avec le code de mon 1er post, si j'effectue la manip suivante:
    - j'affiche la view1,
    - je modifie la valeur bindée ce qui entraine un affichage de la view2 à la place de la view1
    - j'appelle une commande qui valide mon entity

    cela entraine un affichage des ValidationToolTip de ma view1 en haut à gauche de l'écran SL.

    Donc la view1 doit bien être présente qq part

  6. #6
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    En general je fais ca differement.

    D'abord je crees 3 DataTemplate avec tes vues dedans.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <DataTemplate x:Key="view1">
       <views:View1 />
    </DataTemplate>
    [...]
    Ensuite je crée une sorte de DataTemplateSelector (la classe + une attached proprety) qui selon une valeur affecte tel ou tel DataTemplate a la propriete ContentTemplate d'un ContentControl. Le Content est toujours bindé sur l'objet business du ViewModel.

  7. #7
    Membre actif Avatar de freezer08
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 59
    Par défaut
    La solution proposée par Skyounet est bonne également. J'ai trop l'habitude de faire du ViewModel first moi ...

    Pour plus d'explications sur le DataTemplateSelector : http://www.e-naxos.com/Blog/post/201...eSelector.aspx.

    Pour le problème de la popup de validation, c'est assez bizarre que tu aies la popup de validation de l'ancienne vue si tu viens de la changer. Un ContentControl ne peut afficher qu'1 élément à la fois.

  8. #8
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Je vais essayer de trouver plus de détails sur cette approche

  9. #9
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Citation Envoyé par freezer08 Voir le message
    La solution proposée par Skyounet est bonne également. J'ai trop l'habitude de faire du ViewModel first moi ...

    Pour plus d'explications sur le DataTemplateSelector : http://www.e-naxos.com/Blog/post/201...eSelector.aspx.

    Pour le problème de la popup de validation, c'est assez bizarre que tu aies la popup de validation de l'ancienne vue si tu viens de la changer. Un ContentControl ne peut afficher qu'1 élément à la fois.
    Merci pour le lien.

    Sinon, je ne passe pas par un ContentControl dans l'état actuel des choses.

Discussions similaires

  1. [MVVM] Problème de binding avec UserControl
    Par sebastien.hebrard dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 20/04/2013, 17h51
  2. Binding List<UserControl> to Repeater
    Par g_tarik0010 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 30/12/2011, 05h24
  3. Binding d'un Button.Content via un converter
    Par lutecefalco dans le forum Silverlight
    Réponses: 5
    Dernier message: 07/09/2011, 17h59
  4. Binding de Button.Content dans un DataTemplate
    Par Invité dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 22/06/2011, 18h12
  5. Réponses: 0
    Dernier message: 22/08/2010, 15h43

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