Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1

MVVM работа со сложными объектами

07.03.2025, 11:30. Показов 2791. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня.

Прошу большими камнями не кидаться, т.к. я только начал читать про WPF и возможности XAML.
Итак к сути. Есть VM, которая содержит коллекцию сложных объектов (групп студентов)
ViewModel
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
using WpfApp.Data;
using System.Collections.Generic;
using System.Collections.ObjectModel;
 
namespace WpfApp.ViewModels
{
  public class MainWindowViewModel
  {
    public ObservableCollection<GroupOfStudents> StudentGroups { get; }
 
    public MainWindowViewModel()
    {
      StudentGroups = new ObservableCollection<GroupOfStudents>()
      {
        new GroupOfStudents(){
          Name = "Класс 123",
          Students = new List<Student>()
          {
            new Student(){ Name= "Иванов", Age=17, AverageScore=4.4},
            new Student(){ Name = "Петров", Age=17, AverageScore=4.3},
            new Student(){ Name="Сидоров", Age=17, AverageScore=4.1}
          }
        },
        new GroupOfStudents()
        {
          Name = "Класс 321",
          Students = new List<Student>()
          {
            new Student(){ Name="Кудряшов", Age=18, AverageScore=4.45},
            new Student(){ Name="Смирнов", Age=18, AverageScore=3.5}
          }
        }
      };
    }
  }
}

Сами группы и студенты описаны так
Данные
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
using System.Collections.Generic;
 
namespace WpfApp.Data
{
  public class GroupOfStudents
  {
    public string Name { get; set; }
    public List<Student> Students { get; set; }
 
    public GroupOfStudents()
    {
      Students = new List<Student>();
    }
  }
}
 
namespace WpfApp.Data
{
  public class Student
  {
    public string Name { get; set; }
    public int Age { get; set; }
    public double AverageScore { get; set; }
  }
}


Хочется чтобы в форме это выглядело и работало примерно так (см. рисунок)
Вопрос: как это лучше/правильнее сделать? Использовать для каждой группы студентов свою ViewModel и тогда в VM окна будет не коллекция групп, а коллекция VM-групп. Или всё это можно сделать через Template в XALM?
Добавлю, что в каждой визуальной группе должны быть кнопки и др. элементы позволяющие изменять состав группы студентов через вызовы команд.

Не по теме:

Я так и не понимаю как картинку вставить посреди текста

Миниатюры
MVVM работа со сложными объектами  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.03.2025, 11:30
Ответы с готовыми решениями:

Как реализовать динамическое заполнение Grid'a объектами по шаблону MVVM?
Цель такая: нарисовать карту с объектами и обновлять их согласно паттерну MVVM. Примерно так, черная точка (Ellipse) - начало отсчета...

MVVM. Получение данных объекта по сети - в model или во viewmodel?
Здравствуйте! Вникаю в паттерн mvvm, прочитал\посмотрел кучу учебных материалов, и если честно, в голове каша уже. Мне понравился своей...

SQL, работа с ID: Ссылка на объект не указывает на экземпляр объекта
private object getNews(SqlCommand cmd) { SqlDataReader tc = cmd.ExecuteReader(); top10news tn = new...

21
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
06.04.2025, 16:27
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Uswer Посмотреть сообщение
Задача в том, чтобы в столбце "ФИО" отображалось не только одно свойство, например Имя, а некоторое преобразованное значение, например Имя+Возраст.
Несколько вариантов решения.
1) Для иммутабельного типа (иммутамбельного в период его представления), можно использовать конвертер
XML
1
2
3
<DataGridTextColumn Header="ФИО"
                    Binding="{Binding Converter={StaticResource StudentConverter}}"
                    Width="*"/>
Указывать путь не нужно. Или указать точку ... Path=., ...

2) Для иммутабельного типа можно использовать ToString()
C#
1
2
3
4
5
6
public class Student
{
   // Some Code
 
   public string override  ToString() => $"{Family} {Name} {Surname}";
}
XML
1
2
3
<DataGridTextColumn Header="ФИО"
                    Binding="{Binding}"
                    Width="*"/>
2.а) Можно реализовать IFormattable и форматировать вывод по мере необходимости.

Пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Student : IFormattable
{
   // Some Code
 
   public string override  ToString() => $"{Family} {Name} {Surname} {}";
 
   public string ToString(string format, IFormatProvider provider)
   {
       // Создание нужного представления.
       // Например для имени - выводить его полностью или только инициал
       if (format.Contains("N"))
          format = format.Replace("N", Name);
       else if (format.Contains("n"))
          format = format.Replace("n", Name[0]);
 
     // Some Code
 
       return format;
   }
}
Полный вывод имени:
XML
1
2
3
<DataGridTextColumn Header="ФИО"
                    Binding="{Binding StringFormat=N}"
                    Width="*"/>
Вывод инициала имени:
XML
1
2
3
<DataGridTextColumn Header="ФИО"
                    Binding="{Binding StringFormat=n}"
                    Width="*"/>

Для ФИО может StringFormat выглядеть так: "F N S" или "F n. s.".

3) Для мутабельного типа можно использовать мульти конвертер:
XML
1
2
3
4
5
6
7
8
9
10
<DataGridTextColumn Header="ФИО"
                    Width="*">
    <DataGridTextColumn.Binding>
        <MultiBinding Converter="{StaticResource StudentMultiConverter}">
            <Binding Path="Family"/>
            <Binding Path="Name"/>
            <Binding Path="Surname"/>
        </MultiBinding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>
В мультиконвертер придёт массив из трёх string и надо по ним сформировать нужный вывод.
Конвертер будет вызываться каждый раз при изменении любой из вложенных привязок.
2
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
06.04.2025, 17:05  [ТС]
Пока сделал по первому типу - через конвертер. Всё остальное беру на вооружение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.04.2025, 17:05

Ссылка на объект не указывает на экземпляр объекта при работе с массивами
Доброго времени суток!Написал программу,но ругается, не понимаю почему:cry: Поясните что нужно сделать,пожалуйста!

Как реализовать работу нескольких окон под шаблоном MVVM?
Использую шаблон MVVM. Всё что было в слое View всегда умудрялся держать только в xaml, и всё прекрасно работало. Но пришла необходимость...

определение свойств объекта во время работы программы
суть в чем: есть класс - person. В нем можно определять свойства. Но ни названия, ни количество, ни границы этих свойств не определены ...

Не работает (видимо) байндинг при добавлении в коллекцию из другого потока (MVVM)
В общем, написал программу (WPF). Когда весь код был в MainWindow.xaml.cs, то такой код нормально работал: private...

Ссылка на объект не указывает на экземпляр объекта при работе с делегатами
Добрый вечер, уважаемые форумчане. При работе с делегатами столкнулся со следующей проблемой: NullReferenceException не обработано ...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последнея моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru