Ammar.Dev
Messages postés69Date d'inscriptionmercredi 5 octobre 2005StatutMembreDernière intervention28 janvier 2021
-
1 févr. 2018 à 00:20
Whismeril
Messages postés18425Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 9 juin 2023
-
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();
}
}
}
Whismeril
Messages postés18425Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 9 juin 2023624 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.