Application WPF avec MVVM

Ammar.Dev 63 Messages postés mercredi 5 octobre 2005Date d'inscription 17 février 2018 Dernière intervention - 1 févr. 2018 à 00:20 - Dernière réponse : Whismeril 11416 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention
- 1 févr. 2018 à 07:52
Bonsoir tous le monde, je cherche a développe une simple application pour comprendre l'architecture MVVM avec WPF. je veux juste insèrér un texte saisie dans un champ de text saisie sur une listview lors de press sur le bouton ajouter.

je créer deux dossier qui sont Modèle et ViewModel et voila le code source insèrer pour chaque fichier sachant que j'utilise l'extension MVVMLightToolkit.

pour le dossier Modèle:
Article.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace GestionArticle.Model
{
  public class Article
    {
        private string _nom;
 
        public string Nom
        {
            get { return _nom; }
            set { _nom = value; }
        }
    }
}


et pour le dossier ViewModel :
IMainViewModel.cs
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Windows.Input;
using GestionArticle.Model;
 
namespace GestionArticle.ViewModel
{
  public  interface IMainViewModel
    {
        string Titre { get; set; }
        ObservableCollection<Article> Articles { get; }
        ICommand ChargerArticleCommand { get; }
    }
}


MainViewModel.cs

using GalaSoft.MvvmLight;
using System.Collections.ObjectModel;
using GestionArticle.Model;
using GalaSoft.MvvmLight.Command;
using System.Windows.Input;
namespace GestionArticle.ViewModel
{
    /// <summary>
    /// This class contains properties that a View can data bind to.
    /// <para>
    /// See http://www.galasoft.ch/mvvm
    /// </para>
    /// </summary>
    public class MainViewModel : ViewModelBase, IMainViewModel
    {
        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
 
        private readonly ObservableCollection<Article> article;
        public MainViewModel()
        {
 
            article = new ObservableCollection<Article>();
            article.Add(new Article { Nom = "article 1" });
            ChargerArticleCommand = new RelayCommand(ChargerArticles);
        }
 
        private void ChargerArticles()
        {
            this.article.Add(new Article { Nom = "Article 2" });
        }
 
        private string _titre;
        public string Titre
        {
            get { return _titre; }
            set
            {
                _titre = value;
                RaisePropertyChanged("Titre");
            }
        }
 
        public ObservableCollection<Article> Articles
        {
            get { return this.article; }
        }
 
        public ICommand ChargerArticleCommand
        {
            get;
            private set;
        }
    }
}


ViewModelLocator.cs

/*
  In App.xaml:
  <Application.Resources>
      <vm:ViewModelLocator xmlns:vm="clr-namespace:GestionArticle.ViewModel"
                                   x:Key="Locator" />
  </Application.Resources>
 
  In the View:
  DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName}"
*/
 
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Ioc;
using Microsoft.Practices.ServiceLocation;
 
namespace GestionArticle.ViewModel
{
    /// <summary>
    /// This class contains static references to all the view models in the
    /// application and provides an entry point for the bindings.
    /// <para>
    /// See http://www.galasoft.ch/mvvm
    /// </para>
    /// </summary>
    public class ViewModelLocator
    {
        static ViewModelLocator()
        {
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
 
            SimpleIoc.Default.Register<IMainViewModel, MainViewModel>();
        }
        public static IMainViewModel MainVM
        {
            get { return ServiceLocator.Current.GetInstance<IMainViewModel>(); }
        }
 
 
        /// <summary>
        /// Gets the Main property.
        /// </summary>
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
            "CA1822:MarkMembersAsStatic",
            Justification = "This non-static member is needed for data binding purposes.")]
       /* public MainViewModel Main
        {
            get
            {
                return ServiceLocator.Current.GetInstance<MainViewModel>();
            }
        }*/
        public static void CleanMain()
        {
            SimpleIoc.Default.Unregister<IMainViewModel>();
            SimpleIoc.Default.Register<IMainViewModel, MainViewModel>();
        }
        public static void Cleanup()
        {
            CleanMain();
        }
    }
}


App.xaml

<Application x:Class="GestionArticle.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:viewModel="clr-namespace:GestionArticle.ViewModel"
             StartupUri="MainWindow.xaml"
             mc:Ignorable="d">
 
    <Application.Resources>
        <!--Global View Model Locator-->
        <viewModel:ViewModelLocator x:Key="Locator"
                             d:IsDataSource="True" />
    </Application.Resources>
 
</Application>


MainWindow.xaml

<Window x:Class="GestionArticle.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:ignore="http://www.ignore.com"
        mc:Ignorable="d ignore"
        Height="410"
        Width="613"
        Title="MVVM Light Application"
 
        DataContext="{Binding MainVM, Source={StaticResource Locator}}">
 
    <!-- <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Skins/MainSkin.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>-->
 
    <Grid x:Name="LayoutRoot">
 
        <TextBlock FontSize="36"
                   FontWeight="Bold"
                   Foreground="#FFF3ACF3"
                   Text="{Binding WelcomeTitle}"
                   VerticalAlignment="Center"
                   HorizontalAlignment="Center"
                   TextWrapping="Wrap" Margin="317.5,138,76.5,194" Width="211" Background="#FF7FE6FD" />
        <ListView HorizontalAlignment="Left" Height="225" Margin="59,31,0,0" VerticalAlignment="Top" Width="185" ItemsSource="{Binding Articles, Mode=OneWay}">
            <ListView.View>
                <GridView>
                    <GridViewColumn/>
                </GridView>
            </ListView.View>
        </ListView>
        <Button Content="Ajouter" HorizontalAlignment="Left" Height="40" Margin="308,292,0,0" VerticalAlignment="Top" Width="162" Command="{Binding ChargerArticleCommand, Mode=OneWay}"/>
 
    </Grid>
</Window>


lorsque j’exécute je ne trouve pas l'objet Article insérer par défaut:




je trouve pourquoi il m'affiche dans le premier ligne de listview GestionArticle.Model.Article? et comment je peux remédier ce problème?

Merci d'avance :)
Afficher la suite 

1 réponse

Répondre au sujet
Whismeril 11416 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 avril 2018 Dernière intervention - 1 févr. 2018 à 07:52
0
Utile
Bonjour
dans ton binding tu n'as pas précisé quelles informations de la classe il faut afficher.
Donc le binding prend ToString().
Or tu n'as pas définit ToString(), donc il retourne la valeur par défaut : le nom du Type.

Note, il me semble que dans les 1ere version de WPF la listview n'existait même pas, car une ListBox ou un Stackpanel avec un DataTemplate permet plus de personnalisation que la listview.
Autant en winform elle avait de l'interêt, en wpf je ne pense pas.
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.