abboudi_ammar Ответов: 1

Приложение Wpf с MVVM


Добрый вечер всем, я хочу разработать простое приложение для понимания архитектуры MVVM с помощью WPF. Я просто хочу вставить текст, введенный в текстовое поле, введенное в listview при нажатии кнопки Добавить.
Я создаю две папки, которые являются шаблоном и ViewModel, и вот вставка исходного кода для каждого файла, зная, что я использую расширение MVVMLightToolkit.
Я не понимаю, почему он показывает меня в первой строке listviewArticleManagement.Модель.Статья? и как я могу решить эту проблему?

Что я уже пробовал:

для папки шаблона:
Статьи.в 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; }  
        }  
    }  
} 


и для папки 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();  
        }  
    }  
} 


Приложение.язык 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> 


когда я запускаю я не могу найти статью объект вставить по умолчанию:
изображение

1 Ответов

Рейтинг:
2

Graeme_Grant

Похоже, что модель статьи добавлена в ListView, однако вы неправильно настроили свой столбец. Ознакомьтесь с этой статьей: [^]


abboudi_ammar

но в дизайне MVVM все по-другому. я должен использовать ObservableCollection и связать его с listview

Graeme_Grant

Извините, если я не совсем ясно выразился ... Да, ListView будет видеть изменения в привязке данных только в том случае, если вы используете коллекцию, реализующую INotifyCollectionChanged &усилитель; INotifyPropertyChanged межфазные границы.

Я имел в виду, как привязать свойства модели к столбцам ListView.

abboudi_ammar

"ListView будет видеть изменения в привязке данных только в том случае, если вы используете коллекцию, реализующую интерфейсы INotifyCollectionChanged &INotifyPropertyChanged". достаточно ли для этого ObservableCollection?