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

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

07.03.2025, 11:30. Показов 2749. Ответов 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
2296 / 1612 / 400
Регистрация: 26.06.2017
Сообщений: 4,774
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru