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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2007
    Messages : 134
    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 éclairé
    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
    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
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    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 067
    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 confirmé
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2007
    Messages : 134
    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 éclairé
    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
    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 confirmé
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2007
    Messages : 134
    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?

+ 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