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

Windows Presentation Foundation Discussion :

Manière de procéder [Débutant]


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 87
    Points
    87
    Par défaut Manière de procéder
    Bonjour à tous et merci de l'attention apporté a mon problème.

    Je développe actuellement une petite application wpf pour la gestion de favoris. Cependant je ne suis pas encore ami avec le binding et le mvvm (surtout le VM).

    Dés lors je me pose la question de comment je peux rendre une list de favoris disponible pour l'ensemble de l'application en sachant que :

    Une seule fenêtre unique avec un tabcontrol incorporant des usercontrol.

    La question est donc comment puis-je faire pour que la list des favoris soit accessible pour l'ensemble des usercontrol et ou dois-je l'instancier.

    Merci pour votre aide.

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 34
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

    Un ViewModel peut être utilisé par autant de vue que nécessaire. De ce fait, tu peux instancier dans ton ViewModel, la liste des favoris et ainsi y accéder depuis tes vues grâce au Binding.

    En gros, coté ViewModel, tu peux avoir une propriété comme ceci :

    ViewModel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...
    public ObservableCollection<Favoris> Favoris
    {
          get { return _favoris } 
          set 
          { 
               _favoris = value;
               RaisePropertyChanged("Favoris");
          }
    }
    ...
    Une instance du ViewModel doit être créée dans la vue et affectée à la propriété DataContext du Control désiré pour que le binding fonctionne.

    Ensuite dans la ou les vues, il suffit de faire la liaison comme dans l'exemple ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <ListBox ItemsSource="{Binding Path=Favoris}">...</ListBox>
    En espérant avoir aidé.

  3. #3
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Si ta liste de favoris est disponible dans toute l'application une solution serait de la déclarer dans un ViewModelBase dont tous les autres ViewModel de ton application hériterais pour y avoir accès de partout.

  4. #4
    Membre régulier
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 87
    Points
    87
    Par défaut
    OK je comprend le principe.

    malheureusement je ne vois pas comment le mettre en oeuvre.
    En effet j'ai du mal à comprendre la manière dont l'instanciation de la ViewModel se fait ni ou elle se fait.

    Dans le cas de cette viewmodel il faut également que je la précise à l'intérieur de mes usercontrol alors?

    En tout cas merci pour l'aide afin d'éclaircir les points obscurs. Auriez-vous une bonne explication pour le viewModel?

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 34
    Points : 78
    Points
    78
    Par défaut
    Je te conseille de lire ce document qui te permettra d'éclaircir tout ça :

    http://japf.developpez.com/tutoriels...-et-testables/

    L'instanciation du ViewModel par exemple y est décrite.

  6. #6
    Membre régulier
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 87
    Points
    87
    Par défaut
    Après lecture attentive de l'article, j'ai donc fait:

    Une classe model pour les caractéristiques d'un favoris
    Une classe viewmodel pour la Liste des favoris et toutes les action en rapport avec la liste des favoris.
    Un user control reprenant la list des favoris ainsi que le détail du favoris sélectionné dans la liste

    Cependant je n'arrive pas à lier mon user control avec la vue model.

    Les codes sont les suivant:

    Fenêtre principale de l'application
    Code xaml : 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
    <Window
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:UC="clr-namespace:WebMark.Views.UC" x:Class="WebMark.Views.Windows.MainWindow"
            Title="MainWindow" Height="600" Width="800">
     
    	<Grid>
    		<Grid.RowDefinitions>
    			<RowDefinition Height="25" />
    			<RowDefinition Height="*" />
    			<RowDefinition Height="35" />
    		</Grid.RowDefinitions>
     
    		<TabControl HorizontalAlignment="Stretch" Height="Auto" Margin="10" Grid.Row="1" VerticalAlignment="Stretch" Width="Auto">
    			<TabItem Header="Favoris">
    				<Grid>
    					<UC:UCListMarks x:Name="UCList" Margin="10,10,10,160" />
    				</Grid>
    			</TabItem>
    		</TabControl>
    	</Grid>
    </Window>

    le .cs
    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
    using System;
    using System.Windows;
    using WebMark.Helpers.Services;
    using WebMark.ViewModel;
     
    namespace WebMark.Views.Windows
    {
     
        public partial class MainWindow : Window
        {
    	ListMarkVM LstMarks = new ListMarkVM();
     
            public MainWindow()
            {
    			InitializeComponent();
    			this.UCList.DataContext = this.LstMarks;		
            }
     
    	private void MenuItem_Click_3(object sender, RoutedEventArgs e) //Pour tester le chargement de la list des favoris
    	{
             	this.LstMarks.loadfile();
    	}
        }
    }
    La vue model
    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
    using System.Collections.ObjectModel;
    using WebMark.Helpers;
    using WebMark.Models;
     
    namespace WebMark.ViewModel
    {
    	internal class ListMarkVM : ObjetPropChanged
    	{
     
    		private ObservableCollection<MarkModel> _ListMarks;
    		public ObservableCollection<MarkModel> ListMarks
    		{
    			get { return _ListMarks; }
    			set { _ListMarks = value; OnPropertyChanged("ListMarks"); }
    		}
     
    		public ListMarkVM()
    		{ }
     
    		public void loadfile() //Charge effectivement bien dans _ListMarks
    		{
    			var ListM = WebMark.Helpers.Services.Html.GetFromHtml();
    			this._ListMarks = new ObservableCollection<MarkModel>(ListM);
    		}
     
    	}
    }
    et le user control
    Code xaml : 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
    44
    45
    46
    <UserControl
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:local="clr-namespace:WebMark.Views.UC" x:Class="WebMark.Views.UC.UCListMarks" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="530">
     
        <UserControl.Resources>
            <!-- templates list -->
            <DataTemplate x:Key="MarkItemTemplate">
                <Grid x:Name="test">
                    <TextBlock x:Name="test1" Text="{Binding Nom}"
            			Grid.Column="1"
            			Margin="2,5,0,0" />
                </Grid>
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding Nom}" Value="">
                        <Setter TargetName="test" Property="Background"  Value="Red" />
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </UserControl.Resources>
     
        <Grid>
            <Grid Background="White">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="225" />
                    <ColumnDefinition Width="2" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
     
                <GridSplitter HorizontalAlignment="Right" 
    						VerticalAlignment="Stretch" 
    						Grid.Column="1"
    						ResizeBehavior="PreviousAndNext"
    						Width="5" Background="Black"/>
                <ListBox Name="listMarks" HorizontalAlignment="Stretch" Margin="10" VerticalAlignment="Stretch"
                        ItemsSource="{Binding Path=ListMarks}"
    		    IsSynchronizedWithCurrentItem="True"
                        ItemTemplate="{StaticResource MarkItemTemplate}"/>
                <local:UCMarkInfo Grid.Column="2" Margin="10" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" DataContext="{Binding ElementName=listMarks, Path=SelectedItem}" />
    		</Grid>
        </Grid>
    </UserControl>

    Comment se fait-il que le lien ne se fait pas et que la liste ne se charge pas??

    J'ai bien une vue qui n'est que de l'affichage
    La class viewmodel est bien instancié et liée au datacontext du usercontrol
    Et les itemsSource de la liste du usercontrol renvois bien sur la propriété ListMarks de la vuemodel.

    Il y a donc une subtilité qui m'échappe.

    Une petite idée?

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 34
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

    Essaye dans ton ViewModel d'initialiser ta liste comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.ListMarks = new ObservableCollection<MarkModel>(ListM);
    Avec ceci, tu devrai passer dans le setter de la propriété et donc signaler la vue du changement.

  8. #8
    Membre régulier
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 87
    Points
    87
    Par défaut
    Le changement a été fait.

    Cette fois je passe bien par le setter et le OnPropertyChanged("ListMarks") pour annoncer le changement de ma propriété ListMarks de la VueModel.

    Pourtant la list du usercontrol reste parfaitement blanche. :-(

    Une autre idée? existe-t-il un mode de pas à pas pour débugger et voir ce qui se passe lors du binding?

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 34
    Points : 78
    Points
    78
    Par défaut
    Voici un très bon lien qui va te permettre de debugger des data bindings :

    http://www.wpf-tutorial.com/data-binding/debugging/

    Avec les techniques présentées tu devrai pouvoir identifier la source du problème (DataContext ou autre).

  10. #10
    Membre régulier
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 87
    Points
    87
    Par défaut
    Ok les manipulation du post me permette de voir qu'il y a bien une erreur mais je ne comprend rien à ce que le debugger me fourni.

    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
     
    ...
    Le thread 0x1f48 s'est arrêté avec le code 259 (0x103). //Normal ou non
    Le thread 0x148c s'est arrêté avec le code 259 (0x103).
    ...
    System.Windows.Data Warning: 56 : Created BindingExpression (hash=52010555) for Binding (hash=21356974)
    System.Windows.Data Warning: 58 : Path: 'ListMarks'
    System.Windows.Data Warning: 60 : BindingExpression (hash=52010555): Default mode resolved to OneWay
    System.Windows.Data Warning: 61 : BindingExpression (hash=52010555): Default update trigger resolved to PropertyChanged
    System.Windows.Data Warning: 62 : BindingExpression (hash=52010555): Attach to System.Windows.Controls.ListBox.ItemsSource (hash=38448401)
    System.Windows.Data Warning: 67 : BindingExpression (hash=52010555): Resolving source 
    System.Windows.Data Warning: 70 : BindingExpression (hash=52010555): Found data context element: ListBox (hash=38448401) (OK)
    System.Windows.Data Warning: 71 : BindingExpression (hash=52010555): DataContext is null
    System.Windows.Data Warning: 65 : BindingExpression (hash=52010555): Resolve source deferred
    ...
    System.Windows.Data Warning: 67 : BindingExpression (hash=52010555): Resolving source 
    System.Windows.Data Warning: 70 : BindingExpression (hash=52010555): Found data context element: ListBox (hash=38448401) (OK)
    System.Windows.Data Warning: 78 : BindingExpression (hash=52010555): Activate with root item 'ListMarksp'
    'WebMark.vshost.exe' (CLR v4.0.30319: WebMark.vshost.exe)*: Chargé 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\PresentationFramework-SystemCore\v4.0_4.0.0.0__b77a5c561934e089\PresentationFramework-SystemCore.dll'. Chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    System.Windows.Data Warning: 108 : BindingExpression (hash=52010555):   At level 0 - for String.ListMarks found accessor <null>
    System.Windows.Data Warning: 108 : BindingExpression (hash=52010555):   At level 0 - for EnumerableCollectionView.ListMarks found accessor <null>
    System.Windows.Data Warning: 108 : BindingExpression (hash=52010555):   At level 0 - for Char.ListMarks found accessor <null>
    System.Windows.Data Error: 40 : BindingExpression path error: 'ListMarks' property not found on 'object' ''String' (HashCode=-1199406334)'. BindingExpression:Path=ListMarks; DataItem='String' (HashCode=-1199406334); target element is 'ListBox' (Name='listMarks'); target property is 'ItemsSource' (type 'IEnumerable')
    System.Windows.Data Warning: 80 : BindingExpression (hash=52010555): TransferValue - got raw value {DependencyProperty.UnsetValue}
    System.Windows.Data Warning: 88 : BindingExpression (hash=52010555): TransferValue - using fallback/default value <null>
    System.Windows.Data Warning: 89 : BindingExpression (hash=52010555): TransferValue - using final value <null>
    Les questions sont donc:
    1. Est-ce que c'est normal qu'un thread se termine avec un code 259?
    2. Apparemment il ne trouve pas la propriété ListMarks sur l'objet (Si j'ai bien compris - Pourtant il est bien instancié)



    Edit1:

    Je suis parvenu a faire le lien mais en remplaçant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.DataContext = this.LstMarks;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var binding = new Binding { Source = this.LstMarks };
    this.UCList.SetBinding(DataContextProperty, binding);
    Quelle différence entre les deux ?

    Edit 2:

    C'est bon ca marche également avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.UCList.DataContext = this.LstMarks;
    le Nom du usercontrol avait disparu.

    Est-ce qu'il serait quand même possible de répondre au question de ce post? et merci pour l'aide. Je commence à y voir plus clair dans le principe de MVVM mais le binding reste toujours flou (j'ai encore des questions sur le binding mais je ne sais pas si je dois ouvrir un nouveau post ou non).

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 34
    Points : 78
    Points
    78
    Par défaut
    1. Est-ce que c'est normal qu'un thread se termine avec un code 259?
    Je dirai que c'est tout à fait normal mais je n'ai aucun élément pour justifier ma réponse.

    Je suis parvenu a faire le lien mais en remplaçant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.DataContext = this.LstMarks;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var binding = new Binding { Source = this.LstMarks };
    this.UCList.SetBinding(DataContextProperty, binding);
    Quelle différence entre les deux ?
    Dans le deuxième cas tu déclare ton Binding par code avec comme source le VM. Ca fonctionne mais pour chaque liaison tu devra définir la source ce qui n'est pas nécessaire si tu définit le DataContext sur un élément parent comme le UserControl.

    Concernant le binding, l'idée est de lier un élément graphique avec une propriété dans le code. Dans le cas d'une architecture MVVM il faut absolument que ton élément graphique soit dans un contexte où il connait la propriété du VM. C'est là qu'intervient la propriété DataContext qui va permettre à l'élément de savoir où chercher. Dans ton cas tu peux définir le DataContext dans le code-behind du UserControl UCListMarks comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.DataContext = new ListMarkVM();
    ou en XAML :

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <UserControl.DataContext> 
        <local:ListMarkVM/> 
    </UserControl.DataContext>

    Si tu veux en savoir plus sur le Binding je t'invite à aller sur le net tu trouveras très certainement ton bonheur .

    Si tu as des questions je crois que le mieux c'est d'ouvrir un nouveau post (qu'on me corrige si je me trompe) sauf si c'est lié à ton problème de départ.

    J'espère avoir répondu à tes questions.

  12. #12
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    L’intérêt du MVVM ce n'est pas d'avoir 0 code dans les vues?
    Normalement tu peux faire la liaison avec ton modèle directement dans la vue, et c'est un conteneur IOC qui se charge d'instancier ton VM.

    Utilises-tu une librairie comme MVVM light ?

  13. #13
    Membre régulier
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 87
    Points
    87
    Par défaut
    @Cryptark
    : J'espère avoir répondu à tes questions.
    Oui merci beaucoup c'est tout de suite plus clair quand on a les bons tuto au bon moment. Je les avait déjà lu me je ne comprenait rien à l'époque. Ca commence à s'éclaircir.

    @youtpout978
    L’intérêt du MVVM ce n'est pas d'avoir 0 code dans les vues?
    J'avais lu en son temps l'article suivant lors de mes recherche sur le pattern MVVM http://www.e-naxos.com/Blog/post/Fau...ern-MVVM-.aspx. Il en ressort que on pourrait, éventuellement, mettre tout le VueModel dans le code behind de la vue...

    Normalement tu peux faire la liaison avec ton modèle directement dans la vue, et c'est un conteneur IOC qui se charge d'instancier ton VM.
    Justement c'est ce que je n'aime pas et trouve trop abstrait (En plus c'est quoi un controleur IOC ).
    Venant de PHP je comprenais bien le pattern MVC mais on développait tout et je n'aime pas ne pas savoir ce qui est fait (déformation d'architecte oblige ou on contrôle tout de A à Z si on veut que ce soit fait correctement pour éviter les conflits. ). C'est pourquoi je préfère le placer dans le code behind de la vue.
    J'avait vu lors de mes recherches qu'un modèle MVVM implémentait une interface pour la vueModel et le model. Je trouvais donc que ça faisait beaucoup de code à écrire pour finalement pas grand chose.

    Utilises-tu une librairie comme MVVM light ?
    Je commence seulement avec le pattern MVVM et le binding. J'attends d'y voir plus clair avant d'utiliser une librairie qu'il faut encore apprendre... De plus je ne fais que des petits projet actuellement et j'ai peur qu'il deviennent lourd à développer avec des librairies tierce

    @Tous
    Du coup les dernières questions sur les manières de procéder sont:

    1. Dans le cas ou j'ai une class model courte (par exemple un code postal et une ville) n'ai-je pas intérêt à placer directement les propriétés dans la vuemodel?
    2. Dans le cas d'une classe ViewModelBase dont tous les autres ViewModel de ton application hériterais comme le faisait remarquer youtpout978. Comment se passe la création d'une vuemodel car vuemodel serait ré-instancier à chaque fois ou peut-elle être statique pour ne pas changer entre les instanciations des parents?
    3. Peut-on lier plusieurs vues model par le code au datacontext de la vue? Est-ce conseillé?
    4. Peut-on lier des Vues à des VuesModel statique et est-ce conseillé?
    5. ... Peut-être d'autre en fonction de la tournure du post

  14. #14
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Novembre 2014
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 196
    Points : 331
    Points
    331
    Par défaut
    1 : C'est une question de goût les puristes dirons qu'il faut un Model et un ViewModel a chaque fois, pour ma pare je suis plus pragmatique, je fait un ViewModel , et quand je me rend compte qu'il contient trop de donnés qui n'ont pas vraiment de rapport avec la glue que doit être un ViewModel alors je fait un Model pour mettre ces propriété dedans.

    2 : une classe ViewModelBas sert surtout a avoir une implémentation de base pour certains comportement, notification, validation, le Framework s'appuie sur le fait que des instance implémente certaines interface, par conséquent elle ne peut pas être statique. En revanche ton ajout suppression modifucation de favoris pourrais se faire via un service (static, singleton), qui aurais une seule instance de l'ObservableCollection, les ViewModel n'ayant alors que des instances de ListCollectionView avec la collection du service comme source.

    3 : tu peut toujours faire un ViewModel qui contient des ViewModel tout est possible.

    4 : oui c'est possible mais via une instance unique et pas et en static car comme dit plus haut le Framework cherche des instances.

  15. #15
    Membre régulier
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par champsy_dev Voir le message
    2 : une classe ViewModelBas sert surtout a avoir une implémentation de base pour certains comportement, notification, validation, le Framework s'appuie sur le fait que des instance implémente certaines interface, par conséquent elle ne peut pas être statique. En revanche ton ajout suppression modifucation de favoris pourrais se faire via un service (static, singleton), qui aurais une seule instance de l'ObservableCollection, les ViewModel n'ayant alors que des instances de ListCollectionView avec la collection du service comme source.
    Je comprend jusqu'au singelton mais après c'est très flou. En implémentation ca donnerait quelque chose comme quoi? Parce que je m'y pers entre les ObservableCollection, ListCollectionView avec la collection du service comme source.

    Pourriez-vous détailler un peu plus. Merci

  16. #16
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Novembre 2014
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 196
    Points : 331
    Points
    331
    Par défaut
    Je te met un exemple,

    Le Model de BookMark (juste pour l'exemple à remplacer par le tient):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class BookmarkItem 
        {
            public String DisplayName { get; set; }
            public String Url { get; set; }
     
        }
    Le service :
    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
    44
    45
    46
    47
    48
    49
     
    public class BookmarkService
        {
            private ObservableCollection<BookmarkItem> _bookmarks;
     
            public ObservableCollection<BookmarkItem> Bookmarks
            {
                get { return _bookmarks; }           
            }
            private static BookmarkService _instance = null;
            public static BookmarkService Instance
            {
                get
                {
                    if (_instance == null)
                    { _instance = new BookmarkService(); }
                    return _instance;
                }
            }
     
            public void AddBookMark(BookmarkItem item)
            {
                this._bookmarks.Add(item);
            }
     
            public void AddBookMark(string displayName, string url)
            {
                BookmarkItem item = new BookmarkItem() {DisplayName=displayName ,Url = url  };
                this.AddBookMark(item);
            }
     
     
            public void RemoveBookMark(BookmarkItem item)
            {
                if (this._bookmarks.Contains(item))
                { this._bookmarks.Remove(item); }
            }
            public void RemoveBookMarkByDisplayName(String displayName)
            {
                BookmarkItem item = (from i in _bookmarks where i.DisplayName.Equals (displayName) select i).FirstOrDefault();
                if (item != null)
                {this._bookmarks.Remove(item);}
            }
     
            private BookmarkService()
            {
                _bookmarks = new ObservableCollection<BookmarkItem>();
            }
        }
    Et un exemple de ViewModel :
    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
     
    public class BookmarkManagerViewModel
        {
     
            private ListCollectionView _bookMarks;
     
            public ListCollectionView BookMarks
            {
                get { return _bookMarks; }
     
            }
     
            public BookmarkManagerViewModel()
            {
                this._bookMarks = new ListCollectionView(BookmarkService.Instance.Bookmarks);
            }
        }

  17. #17
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Novembre 2014
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 196
    Points : 331
    Points
    331
    Par défaut
    De cette façon, tu peut filtrer, trier , grouper les ListCollectionView des ViewModels sans affecter la collection du service (regarde la documentation de ListCollectionView pour ce faire) .
    De même tout ajout , suppression d'éléments dans la collection du service est automatiquement refléter dans tout les ViewModels.

    Est-ce plus clair ?

  18. #18
    Membre régulier
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par champsy_dev Voir le message
    De cette façon, tu peut filtrer, trier , grouper les ListCollectionView des ViewModels sans affecter la collection du service (regarde la documentation de ListCollectionView pour ce faire) .
    De même tout ajout , suppression d'éléments dans la collection du service est automatiquement refléter dans tout les ViewModels.

    Est-ce plus clair ?
    Nettement, maintenant je vais passer à la mise en forme de tous ca. Il me reste pourtant une petite dernière question. Si je veux donner à mon model une fonction ToString, Est-ce que je peux la mettre dans mon model ou il vaut mieux n'avoir que les propriété dans la class model?

  19. #19
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Novembre 2014
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 196
    Points : 331
    Points
    331
    Par défaut
    Tu peut tout a fait surcharger ToString dans ton modèle, attention cependant si on regarde les implémentations existantes de ToString elle renvoie des informations sur la donné qui on plus un tête a être afficher dans un fichier log plutôt qu'a être affiché dans l'interface utilisateur. Donc je dirais si c'est pour du log ou a destination de développeur oui, si c'est pour afficher a l'utilisateur fait plutôt une propriété en lecture seule, DisplayName par exemple de type String et renvoie une chaine texte. Utilise ensuite cette propriété dans l'interface graphique. Bon code.

  20. #20
    Membre régulier
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 127
    Points : 87
    Points
    87
    Par défaut
    Information sur la suite.

    Ne parvenant pas à mettre en place le binding sur ma list vue de la ListCollectionView dans la solution de champsy_dev J'ai donc pris la solution proposé par Cryptark.

    En tout cas merci de votre aide.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/12/2011, 16h18
  2. [Débutant][C#] Compression de dossier de manière récurssive
    Par LordProgz dans le forum Windows Forms
    Réponses: 10
    Dernier message: 12/01/2010, 13h55
  3. impression contenu db de manière formatée
    Par micknic dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 04/10/2004, 11h53
  4. [mise à jour]Comment procéder sans tout péter...
    Par FFF dans le forum Installation
    Réponses: 3
    Dernier message: 10/09/2003, 08h11
  5. Documentation sur la manière de travailler avec le XML en java
    Par DelPiero62 dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 26/03/2003, 09h16

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