Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
6 / 6 / 0
Регистрация: 21.05.2016
Сообщений: 17
WPF

Программное заполнение коллекции и отображение в DataGrid с использованием MVVM

22.07.2019, 19:11. Показов 5572. Ответов 29

Студворк — интернет-сервис помощи студентам
Здравствуйте. Только начинаю вникать в MVVM. Нашел такой пример:
Модель:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
namespace MVVMTest.Model
{
    public class Person : INotifyPropertyChanged
    {
        #region INotifyPropertyChanged Impl
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
                handler(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion
 
        private string m_firstName;
        public string FirstName
        {
            get { return m_firstName; }
            set
            {
                if (value == m_firstName)
                    return;
 
                m_firstName = value;
                OnPropertyChanged();
            }
        }
 
        private string m_lastName;
        public string LastName
        {
            get { return m_lastName; }
            set
            {
                if (value == m_lastName)
                    return;
 
                m_lastName = value;
                OnPropertyChanged();
            }
        }
 
        private int m_age;
        public int Age
        {
            get { return m_age; }
            set
            {
                if (value == m_age)
                    return;
 
                m_age = value;
                OnPropertyChanged();
            }
        }
    }
 
 
}
ВьюМодель:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
namespace MVVMTest.ViewModel
{
        public class MyViewModel : INotifyPropertyChanged
        {
            #region INotifyPropertyChanged Impl
            public event PropertyChangedEventHandler PropertyChanged;
            protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                    handler(this, new PropertyChangedEventArgs(propertyName));
            }
            #endregion
 
            public ObservableCollection<Person> m_people = new ObservableCollection<Person>();
        public ObservableCollection<Person> test = new ObservableCollection<Person>();
            public ObservableCollection<Person> People
            {
                get { return m_people; }
                private set
                {
                    if (value == m_people)
                        return;
 
                    m_people = value;
                    OnPropertyChanged();
                }
            }
 
        public MyViewModel()
        {
            m_people.CollectionChanged += m_people_CollectionChanged;
            m_people.Add(new Person() { FirstName = "Bob", LastName = "Brown", Age = 45 });
            m_people.Add(new Person() { FirstName = "Sarah", LastName = "Smith", Age = 25 });
        }
 
            private void m_people_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
            {
                if (e.NewItems != null && e.NewItems.Count > 0)
                {
                    foreach (INotifyPropertyChanged item in e.NewItems.OfType<INotifyPropertyChanged>())
                    {
                        item.PropertyChanged += person_PropertyChanged;
                    }
                }
                if (e.OldItems != null && e.OldItems.Count > 0)
                {
                    foreach (INotifyPropertyChanged item in e.OldItems.OfType<INotifyPropertyChanged>())
                    {
                        item.PropertyChanged -= person_PropertyChanged;
                    }
                }
            }
            //Property Changed will be called whenever a property of one of the 'Person'
            //objects is changed.
            private void person_PropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                var row = sender as Person;
                SaveData(row);
            }
 
            private void SaveData(Person row)
            {
                //Save the row to the database here.
            }
 
        }
}
И Xaml:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<Window x:Class="MVVMTest.View.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:viewmodel="clr-namespace:MVVMTest.ViewModel"
        mc:Ignorable="d"
        Title="MainWindow" Height="284.025" Width="525">
    <Window.DataContext>
        <viewmodel:MyViewModel/>
    </Window.DataContext>
    <Grid Margin="0,0,0,41">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="168*"/>
            <ColumnDefinition Width="349*"/>
        </Grid.ColumnDefinitions>
        <DataGrid ItemsSource="{Binding People, Mode=OneWay}" AutoGenerateColumns="False" Height="88" VerticalAlignment="Top" Grid.ColumnSpan="2">
            <DataGrid.Columns>
                <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}"/>
                <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}"/>
                <DataGridTextColumn Header="Age" Binding="{Binding Age}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
Вопрос - как мне программно заполнять коллекцию m_people , чтобы изменения отображались в датагриде?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.07.2019, 19:11
Ответы с готовыми решениями:

Отображение номеров строк в DataGrid в MVVM
Здравствуйте! kenny69, Casper-SC, подскажите как реализовать отображение номера строк DataGrid при использовании паттерна MVVM. Без MVVM...

Отображение коллекции в DataGrid
Привет всем! Есть коллекция: private ObservableCollection&lt;Points&gt; _tablePointsList; public ObservableCollection&lt;Points&gt;...

Программное создание item в TreeView MVVM
Доброго времени суток, очень нужна помощь: Нажатием кнопки пытаюсь добавить узел в древовидное меню. Ничего не выходит. Причем...

29
6 / 6 / 0
Регистрация: 21.05.2016
Сообщений: 17
24.07.2019, 12:08  [ТС]
Студворк — интернет-сервис помощи студентам
Приложение будет работать только на одном рабочем месте. Парсит несколько сайтов, делает расчет, складывает результат в коллекцию и выводит на экран. Причем данные парсинга я не храню в файлах. Они нужны только на время работы приложения.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 2
24.07.2019, 13:52
Цитата Сообщение от c0d3r Посмотреть сообщение
Парсит несколько сайтов, делает расчет, складывает результат в коллекцию и выводит на экран
ОК!
Но тогда нужна совсем иная Model. По сути в таком приложении Model - это сайты. А на компе будет находится Локальная Модель которая фактически является часть. ViewModel.

У Вас локальная Модель есть? То есть та часть приложения которая будет парсить сайты? И вам только вывод информации с сайтов нужен? Или туда тоже что-то отправлять будете?
1
6 / 6 / 0
Регистрация: 21.05.2016
Сообщений: 17
30.07.2019, 18:54  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
У Вас локальная Модель есть? То есть та часть приложения которая будет парсить сайты
Да, есть, вот пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public void GetInfo(IWebDriver driver)
        {
            int pos = 0;
            IList<IWebElement> FirstName = null;
            IList<IWebElement> LastName = null;
            IList<IWebElement> Age = null;
 
            IList<IWebElement> GetTable = driver.FindElements(By.CssSelector("tbody.table")).ToList();
               for (int j = 0; j < GetTable.Count; j++)
               {
                   IList<IWebElement> GetRow = GetTable[j].FindElements(By.CssSelector("table_row")).ToList();
                   for (int i = 0; i < GetRow.Count; i++)
                   {
                           FirstName = GetRow[i].FindElements(By.CssSelector("a.table__name-text"));
                           LastName = GetRow[i].FindElements(By.CssSelector("div.lastname"));
                           Age = GetRow[i].FindElements(By.CssSelector("td.age_text"));
 
                               Info.Insert(pos, new Person()
                               {
                                   FirstName = FirstName[0].Text,
                                   LastName = LastName[0].Text,
                                   Age = Age[0].Text
                               });
                               pos++;
                           }
 
                   }
               }
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И вам только вывод информации с сайтов нужен? Или туда тоже что-то отправлять будете?
Да, только парсинг информации, обновление коллекции идет постоянно, но сохранять ее не нужно на диск. Нет, авторизаций и любых других манипуляций с сайтом нет.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 2
30.07.2019, 21:47
Цитата Сообщение от c0d3r Посмотреть сообщение
Да, есть, вот пример:
Закоменте чуток.
Я же не могу понять просто так что к чему у вас.
Вот допустим у вас переменные метода FirstName, LastName, Age, GetTable для чего? Вы их используете только для Info.Insert? После этого в мусор?

Что это за коллекция Info? В каком классе всё это находится?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 2
30.07.2019, 21:59
И напишите из какой сборки-пакета IWebDriver и IWebElement.
0
6 / 6 / 0
Регистрация: 21.05.2016
Сообщений: 17
30.07.2019, 22:23  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public void GetInfo(IWebDriver driver)
        {
            int pos = 0;
            IList<IWebElement> FirstName = null;
            IList<IWebElement> LastName = null;
            IList<IWebElement> Age = null;
 
            IList<IWebElement> GetTable = driver.FindElements(By.CssSelector("tbody.table")).ToList(); //получаем таблицу данных на сайте
               for (int j = 0; j < GetTable.Count; j++)
               {
                   IList<IWebElement> GetRow = GetTable[j].FindElements(By.CssSelector("table_row")).ToList(); //получаем строки
                   for (int i = 0; i < GetRow.Count; i++)
                   {
                           FirstName = GetRow[i].FindElements(By.CssSelector("a.table__name-text")); //обращаемся к ячейке в конкретной строке по селектору 
                           LastName = GetRow[i].FindElements(By.CssSelector("div.lastname"));
                           Age = GetRow[i].FindElements(By.CssSelector("td.age_text"));
 
                               Person.Insert(pos, new Person() // заполнили
                               {
                                   FirstName = FirstName[0].Text,
                                   LastName = LastName[0].Text,
                                   Age = Age[0].Text
                               });
                               pos++;
                           }
 
                   }
               }
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И напишите из какой сборки-пакета IWebDriver и IWebElement.
Selenium.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вот допустим у вас переменные метода FirstName, LastName, Age, GetTable для чего? Вы их используете только для Info.Insert? После этого в мусор?
Да. Больше они не нужны.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Что это за коллекция Info? В каком классе всё это находится?
Person. поправил в коде.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 2
30.07.2019, 22:42
Цитата Сообщение от c0d3r Посмотреть сообщение
Selenium.
???
Он что ещё живой?
Его, по-моему, даже в студии уже нет.
Хотел пример создать - а теперь даже не знаю как.

Вы как этот Selenium используете? Или у вас VS старая?

Добавлено через 4 минуты
Поставил NuGet Selenium.WebDriver. Буду разбираться.
0
6 / 6 / 0
Регистрация: 21.05.2016
Сообщений: 17
30.07.2019, 22:46  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы как этот Selenium используете? Или у вас VS старая?
2017 15.5.1
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 2
30.07.2019, 23:20
Цитата Сообщение от c0d3r Посмотреть сообщение
2017 15.5.1
У меня VS 2019 и вроде Selenium нет.
Я думал после 2015 - его исключили из студии.
Завтра разберусь как с ним работать.
Загружу 2017 - посмотрю.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 2
30.07.2019, 23:50
Цитата Сообщение от c0d3r Посмотреть сообщение
Person. поправил в коде.
Person - это же элемент списка!?
Может People?
И метод GetInfo заполняет этот список новыми элементами вставляя их в начало списка?

Если так, то метод GetInfo - это метод Модели. А о списке в VM он ничего знать не должен. То есть лучше переделать так
В класса Person можно добавить конструктор из IWebElement.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    public class Person : OnPropertyChangedClass
    {
        #region Поля для хранения значений свойств
        private string m_firstName;
        private string m_lastName;
        private int m_age;
        #endregion
 
        #region Свойства с INPC
        public string FirstName { get => m_firstName; set => SetProperty(ref m_firstName, value); }
        public string LastName { get => m_lastName; set => SetProperty(ref m_lastName, value); }
        public int Age { get => m_age; set => SetProperty(ref m_age, value); }
        #endregion
 
        #region Конструкторы
        public Person() { }
        public Person(string firstName, string lastName, int age)
        {
            FirstName = firstName;
            LastName = lastName;
            Age = age;
        }
        public Person(IWebElement element)
        {
            FirstName = element.FindElement(By.CssSelector("a.table__name-text")).Text;
            LastName = element.FindElement(By.CssSelector("div.lastname")).Text;
            Age = Convert.ToInt32(element.FindElement(By.CssSelector("td.age_text")).Text);
        }
        #endregion
 
        public override string ToString() => $"Person: {FirstName} {LastName} - {Age};";
 
 
    }
А метод GetInfo пусть возвращает перечень последовательность элементов
C#
1
2
3
4
5
6
7
8
9
        public IEnumerable<Person> GetInfo(IWebDriver driver)
        {
            List<Person> people = new List<Person>();
 
            foreach (IWebElement tab in driver.FindElements(By.CssSelector("tbody.table")).ToArray())
                people.AddRange(tab.FindElements(By.CssSelector("table_row")).ToArray().Select(elem => new Person(elem)));
 
            return people;
        }
VM вызывает метод Модели GetInfo получает от него последовательность элементов и вставляет их в свою коллекцию People. В начало, в конец, в середину - это дело VM. А методу GetInfo знать за это абсолютно не нужно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.07.2019, 23:50

WPF MVVM Бинарная сериализация коллекции классов
Всем привет. Вот есть задачка. Класс. class Employer : INotifyPropertyChanged { #region Properties ...

Программное создание элемента XAML UWP MVVM
До недавнего времени я думал, что умею пользоваться поиском. Однако ничего даже близко похожего я не нашел, поэтому и решил написать на...

Отображение данных в одном datagrid при клике в другом datagrid
Здравствуйте! Хотел уточнить, как можно реализовать возможность при клике на форме в dataGrid1, чтобы динамически изменялись данные в...

MVVM и datagrid
Здравствуйте! Пытаюсь освоить MVVM на wpf хочу сделать, чтобы с помощью entity грузилась таблица в datagrid тут вызываю ...

Mvvm datagrid ef
Здравствуйте форумчане, у меня такая проблема есть приложение При выделении datagrid биндю Selecteditem в textboxы мои ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru