Application WPF avec MVVM

Ammar.Dev Messages postés 52 Date d'inscription mercredi 5 octobre 2005 Statut Membre Dernière intervention 28 janvier 2021 - 1 févr. 2018 à 00:20
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 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 :)

1 réponse

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
1 févr. 2018 à 07:52
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.
0
Rejoignez-nous