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

Vue hybride

lutecefalco Binding de... 29/08/2011, 17h40
freezer08 Tu pourrais également avoir... 30/08/2011, 11h07
lutecefalco Why not. Mais ça va régler... 30/08/2011, 11h33
freezer08 Si ta vue n'est plus... 30/08/2011, 11h53
lutecefalco Avec le code de mon 1er post,... 30/08/2011, 12h06
Message précédent Message précédent   Message suivant Message suivant
  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.

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