@Ledington

Как связать ObservableCollection и INotifyCollectionChanged?

Есть класс Employee: ViewModel, который отображается в классе MainViewModel : ViewModel при вводе данных.
Еще создал класс Tree : INotifyCollectionChanged, но пока не разберусь как его пристыковать к остальному.
Подскажите, пожалуйста, как можно связать ObservableCollection и INotifyCollectionChanged, чтобы оно отображалось в WPFе?
Возможно надо что-нибудь еще в XAML дописать...

Employee: ViewModel
internal class Employee: ViewModel
{
    public string Name { get; set; }

    public int Salary { get; set; }

    public string Display { get { return Name + " - " + Salary; } }
}


Tree : INotifyCollectionChanged
public class Tree : INotifyCollectionChanged
{
    Node _root = null; 

    public event NotifyCollectionChangedEventHandler CollectionChanged;

    public void Add(string name, int pay) 
    {
        Node current = new Node();
        current.Name = name; 
        current.Salary = pay;     
        if (_root != null) 
        {
            _root.Add(current.Name, current.Salary);
        }
        else 
        {
            _root = current;
        }

        CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add));
    }

... и т.д.


MainViewModel : ViewModel
internal class MainViewModel : ViewModel
{
    public MainViewModel()
    {
        Employees = new ObservableCollection<Employee>();
    }

    public ICommand AddEmployeeCommand { get { return new Command(AddEmployee); } }
    public ObservableCollection<Employee> Employees { get; private set; }
    public string Name { get; set; }
    public int Salary { get; set; }

    private void AddEmployee()
    {
        var employee = new Employee() { Name = this.Name, Salary = this.Salary };
        Employees.Add(employee);

        Name = null;
        Salary = 0;
        RaisePropertyChanged(() => Name);
        RaisePropertyChanged(() => Salary);
    }
}
  • Вопрос задан
  • 245 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Ksarrik
В вашем случае для отображения списка Employee достаточно привязать коллекцию ObservableCollection к элементу списка WPF. ObservableCollection уже реализовывает интерфейсы INotifyCollectionChanged и NotifyPropertyChanged, Поэтому никакой дополнительной увязки не требуетсяhttps://docs.microsoft.com/ru-ru/dotnet/api/system.collect...
ObservableCollection можно использовать в чистом виде
А вот если хотите чтобы при изменении свойств класса Employee в интерфейсе обновлялась информация тогда нужно в классе Employee реализовать интерфейс NotifyPropertyChanged.
В вашем случае чтобы увязать ViewModel с WPF достаточно привязать коллекцию к спискам:
<Window x:Class="WpfApp1.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:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded" >
    <Grid>
        <ListBox x:Name="listbox1" DisplayMemberPath="Name">
            </ListBox>
    </Grid>
</Window>


public partial class MainWindow : Window
    {
        private MainViewModel viewModel = new MainViewModel();


        public MainWindow()
        {
            InitializeComponent();
            //добавляем сотрудников
            viewModel.Employees.Add(new Employee() {Name="Иванов Иван" });
            viewModel.Employees.Add(new Employee() { Name = "Петров Петр" });
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //привязываем viewModel (необязательно для отображения списка)
            this.DataContext = viewModel;

            //привязываем коллекцию
            this.listbox1.ItemsSource = viewModel.Employees;
        }
    }


61838d6849b9a243115942.png
Класс Tree в случае реализации необходимых интерфейсов можно использовать вместо класса ObservableCollection.

Подробнее можете посмотреть здесь https://metanit.com/sharp/wpf/22.2.php
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы