powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Проблемы с иерархическими моделями представлений
25 сообщений из 96, страница 1 из 4
Проблемы с иерархическими моделями представлений
    #38632753
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пусть есть иерархическая модель (модель, состоящая из других моделей) - Model3 в коде ниже. Как сделать для этой модели модель представления? При этом эта модель представления должна представлять в виде своих свойств не свойства нижележащих моделей представления, а сами эти нижележащие модели представления.

Мой вариант показан в коде ниже как ViewModel3. На закомментированный код прошу пока не обращать внимания. Проблема в нём в том, что этот вариант содержит дублирование данных. ViewModel3 содержит не только Model3, которая содержит Model1 и Model2, но и ViewModel1 и ViewModel2, которые тоже содержат Model1 и Model2. В результате, при изменении свойства ViewModel1 (которое принадлежит ViewModel3) я должен не только изменить поле vm1, лежащее в основе этого свойства, но и поле m3. Это нужно сделать потому, что логика изменения ViewModel3 подразумевает отображение этих изменений на Model3. Т. е. главное, это изменить свойства Model3, лежащей в основе - не зря эта модель передаётся в конструкторе. Изменить Model3 (в виде поля m3) я могу либо изменив все свойства соответствующей модели m1, представляющей поле m3:

Код: c#
1.
m3.M1.N = value.N;



либо изменив саму эту модель:
закомментированный код
Код: c#
1.
m3.M1 = value.M1;



Минус тут в том, что я должен в любом случае изменить ещё и поле vm1, т. к. иначе произошедшие изменения в m3 не отобразятся в соответствующих представлениях для vm1, которые отображают часть данных из m3 по логике вещей.

Так вот, у меня такое ощущение, что у меня неправильный дизайн. Кажется, лишним является создание в конструкторе ViewModel3:

Код: c#
1.
this.vm1 = new ViewModel1(this.m3.M1);



Или, может, лишним является хранение модели Model3

Код: c#
1.
this.m3 = m3;


?

Из-за этого появляется дублирование данных и я должен в каждом сеттере делать два изменения - для каждого свойства составной модели и для каждого свойства в виде отдельной модели представления. При этом реально нужные изменения - только для модели (у меня это Model3 m3), а изменения для ViewModel1 vm1 - только для отображения результата.

Есть какой-нибудь лучший подход?

Код: 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.
69.
class Model1
{
    public int N { get; set; }
}

class Model2
{
    public int N { get; set; }
}

class Model3
{
    public Model1 M1 { get; set; }
    public Model2 M2 { get; set; }
}

class ViewModel1
{
    private Model1 m1;
    public int N
    {
        get { return m1.N; }
        set { m1.N = value; }
    }

    //public Model1 M1
    //{
    //    get { return m1; }
    //}

    public ViewModel1(Model1 m1) { this.m1 = m1; }
}

class ViewModel2
{
    private Model2 m2;
    public int N
    {
        get { return m2.N; }
        set { m2.N = value; }
    }

    public ViewModel2(Model2 m2) { this.m2 = m2; }
}

class ViewModel3
{
    private Model3 m3;
    private ViewModel1 vm1;
    private ViewModel2 vm2;

    public ViewModel1 VM1
    {
        get { return vm1; }
        set 
        {
            vm1 = value;
            m3.M1.N = value.N;
            //m3.M1 = value.M1;
        }
    }

    public ViewModel3(Model3 m3)
    {
        this.m3 = m3;
        this.vm1 = new ViewModel1(this.m3.M1);
        this.vm2 = new ViewModel2(this.m3.M2);
    }
}

...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38632756
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторлибо изменив саму эту модель:
закомментированный код
Код: c#
1.
m3.M1 = value.M1;


Тут ещё проблема в том, что, чтобы это работало, модель представления ViewModel1 должна предоставить свою модель Model1, лежащую в основе, что отображено у меня в закомментированном коде ViewModel1. Т. е. ещё один костыль.
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38632777
Фотография James Bond FR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Есть какой-нибудь лучший подход?

Есть, перестать тренироваться "на кошках", поставить перед собой реальную задачу и ее решить! Только так до Вас дойдет, что ЧИСТЫЙ MVVM это один большой костыль, который в реальный проектах НЕЖИЗНЕСПОСОБЕН!
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38632897
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
James Bond FRuser7320Есть какой-нибудь лучший подход?

Есть, перестать тренироваться "на кошках", поставить перед собой реальную задачу и ее решить! Только так до Вас дойдет, что ЧИСТЫЙ MVVM это один большой костыль, который в реальный проектах НЕЖИЗНЕСПОСОБЕН!
Да. Я начитался статей типа этой . В них предлагается делать четырёх-, пяти- и более слоевые конструкции. Авторы подобных статей бодро говорят, как у них с такими конструкциями всё выходит гладко и чисто. Только у меня сомнения закрадывается, что если в трёх слоях уже многие путаются, то когда намешано 4 слоя и более, да ещё дело касается крупных приложений, типа того же Офиса или Автокада, то всё становится ещё хуже. Авторы почти никогда не говорят, какой сложности были у них проекты. Может, это сраные мессенджеры и проверяльщики статусиков во вконтактиках?

У вас вот какие подходы для борьбы с MVVM?
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38632902
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320У вас вот какие подходы для борьбы с MVVM?
Неправильно спросил. Я хотел спросить, что бы вы предложили мне в моём случае? Модель, состоящая из двух других моделей. В представлении это должно быть представлено так:

- модель, состоящая из других моделей - это контейнер,
- модели, составляющие эту сложную модель - отдельные представления (скажем, на шаблонах данных).

Для меня логично было сделать модель представления для таких представлений в виде такой же включающей еирархии - VM3 имеет поля в виде VM1 и VM2.
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38632910
Фотография James Bond FR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320ично было сделать модель представления для таких представлений в виде такой же включающей еирархии - VM3 имеет поля в виде VM1 и VM2.
Совершеенно верно, и что останавливает?
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633154
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Пусть есть иерархическая модель (модель, состоящая из других моделей) - Model3 в коде ниже. Как сделать для этой модели модель представления? При этом эта модель представления должна представлять в виде своих свойств не свойства нижележащих моделей представления, а сами эти нижележащие модели представления.
Тоже задавался такими вопросами, в итоге вышел на персистентные структуры данных

Ниже сложности C(ln(N)) на единичное изменение по древовидным структурам не обеспечишь, но это очень даже приемлемо
без поддержки языка программирования управлять такими структурами очень трудно (всё время хочется где нить хакнуть)
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633161
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Есть какой-нибудь лучший подход?а525...

1. Читать Фаулер "Рефакторинг".

2. Данные хранить в модели как она есть. Модель лучше сразу приспособить для датабиндинга, чтобы не писать потом для неё обёртки.

3. Логику разместить в UserControl code-behind. Если возникают проблемы с повторным использованием логики в code-behind, то выносить логику в отдельный класс (выделение класса по Фаулеру). Логику оформлять в виде ICommand или EventHandler, в зависимости от потребностей.

Начни с этого. Дальше сам всё поймёшь. Верь мне...
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633182
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class Model1
{
    public int N { get; set; }
}

class Model2
{
    public int N { get; set; }
}

class Model3
{
    public Model1 M1 { get; set; }
    public Model2 M2 { get; set; }
}

Привязывай контролы непосредственно к этой структуре данных. Обёртки не нужны.
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633218
Фотография James Bond FR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К2. Данные хранить в модели как она есть. Модель лучше сразу приспособить для датабиндинга, чтобы не писать потом для неё обёртки.

Оч интересно, а как енто "приспособить для датабиндинга"?
Алексей К3. Логику разместить в UserControl code-behind. Если возникают проблемы с повторным использованием логики в code-behind, то выносить логику в отдельный класс (выделение класса по Фаулеру). Логику оформлять в виде ICommand или EventHandler, в зависимости от потребностей.

Еще интересней, т.е. если у меня 20 формочек, в среднем на каждой висит 20 евентов, то Вы предлагаете 400 евентов в один класс загнать? А если завтра война? Такой жирный класс через границу не унесешь!
Алексей КНачни с этого. Дальше сам всё поймёшь. Верь мне...
Извините, но пока даже с трудом не верится.
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633232
мсущко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К3. Логику разместить в UserControl code-behind.
Нет.

Алексей КЛогику оформлять в виде ICommand.
Да.
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633265
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кuser7320Есть какой-нибудь лучший подход?а525...

1. Читать Фаулер "Рефакторинг".

2. Данные хранить в модели как она есть. Модель лучше сразу приспособить для датабиндинга, чтобы не писать потом для неё обёртки.

3. Логику разместить в UserControl code-behind. Если возникают проблемы с повторным использованием логики в code-behind, то выносить логику в отдельный класс (выделение класса по Фаулеру). Логику оформлять в виде ICommand или EventHandler, в зависимости от потребностей.

Начни с этого. Дальше сам всё поймёшь. Верь мне...
Don't you wanna say MVVM is sucks? B...b...but these and those guys say MVVM is fucking great... Okay

...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633268
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кuser7320
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class Model1
{
    public int N { get; set; }
}

class Model2
{
    public int N { get; set; }
}

class Model3
{
    public Model1 M1 { get; set; }
    public Model2 M2 { get; set; }
}

Привязывай контролы непосредственно к этой структуре данных. Обёртки не нужны.
Я хочу свою работу как портфолио использовать в том числе. Как считаешь, что следует писать в резюме - "умею в MVVM" или не стоит?
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633277
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мсущкоАлексей К3. Логику разместить в UserControl code-behind.
Нет.

Алексей КЛогику оформлять в виде ICommand.
Да.
В логике проблем нет. Проблема в в том, как представить иерархические модели в моделях представления в рамках WPF's MVVM. Я гуглил-гуглил, ничего толкового не нашёл.

Иерархические модели представления в WPF хороши тем, что в представлениях они выглядят как контейнеры, которые состоят из контент презентеров, которые ссылаются на дата темплиты - и всё выглядит логично.
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633278
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
James Bond FRАлексей К2. Данные хранить в модели как она есть. Модель лучше сразу приспособить для датабиндинга, чтобы не писать потом для неё обёртки.

Оч интересно, а как енто "приспособить для датабиндинга"?
Я думаю, он имел ввиду OnPropertyChanged и т. п.
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633308
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
James Bond FRАлексей К2. Данные хранить в модели как она есть. Модель лучше сразу приспособить для датабиндинга, чтобы не писать потом для неё обёртки.

Оч интересно, а как енто "приспособить для датабиндинга"?INotifyPropertyChanged.
James Bond FRАлексей К3. Логику разместить в UserControl code-behind. Если возникают проблемы с повторным использованием логики в code-behind, то выносить логику в отдельный класс (выделение класса по Фаулеру). Логику оформлять в виде ICommand или EventHandler, в зависимости от потребностей.

Еще интересней, т.е. если у меня 20 формочек, в среднем на каждой висит 20 евентов, то Вы предлагаете 400 евентов в один класс загнать? А если завтра война? Такой жирный класс через границу не унесешь! Про 20 и 400 не понял.
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633313
мсущко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user7320В логике проблем нет. Проблема в в том, как представить иерархические модели в моделях представления в рамках WPF's MVVM. Я гуглил-гуглил, ничего толкового не нашёл.
Я тебе в соседней теме давал рецепт, там всё есть. Всё работает на штатном HierarchicalDataTemplate. Модель классическая:

Код: c#
1.
2.
3.
4.
5.
6.
public class Department
{
    public int Id { get; set; }
    public string Title { get; set; }
    public IEnumerable<Department> Departments { get; set; }
}
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633319
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Иерархические модели представления в WPF хороши тем, что в представлениях они выглядят как контейнеры, которые состоят из контент презентеров, которые ссылаются на дата темплиты - и всё выглядит логично.У тебя проблема в первую очередь из-за того, что ты смешиваешь в одних классах логику и данные. Помни:

1. Биндинг можно делать через RelativeSource.
2. У ICommand есть CommandParameter, в который можно передать SelectedItem какого-либо контрола.

И в данном случае даже пофиг, живёт логика в code-behind или где-то ещё.
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633327
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вдогонку: По сути, предлагается завести под логику в ICommand-ах отдельную ViewModel, если разместить это в code-behind религия не позволяет.
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633364
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мсущкоuser7320В логике проблем нет. Проблема в в том, как представить иерархические модели в моделях представления в рамках WPF's MVVM. Я гуглил-гуглил, ничего толкового не нашёл.
Я тебе в соседней теме давал рецепт, там всё есть. Всё работает на штатном HierarchicalDataTemplate. Модель классическая:

Код: c#
1.
2.
3.
4.
5.
6.
public class Department
{
    public int Id { get; set; }
    public string Title { get; set; }
    public IEnumerable<Department> Departments { get; set; }
}


Я уже не про дерево говорю в этой теме.

Наверное, вас смутило слово "иерархические". Но в примере в первом посте видно, что у меня не дерево. Иерархия заключается во включении - т. е. одна модель представления является полем или свойством в другой модели представления.

Вот в чём вопрос.
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633371
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Квдогонку: По сути, предлагается завести под логику в ICommand-ах отдельную ViewModel, если разместить это в code-behind религия не позволяет.
Зачем заводить два файла с кодом вместо одного?

И почему логика только в командах? А в свойствах? А в OnPropertyChanged?
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633376
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кuser7320Иерархические модели представления в WPF хороши тем, что в представлениях они выглядят как контейнеры, которые состоят из контент презентеров, которые ссылаются на дата темплиты - и всё выглядит логично.У тебя проблема в первую очередь из-за того, что ты смешиваешь в одних классах логику и данные. Помни:

1. Биндинг можно делать через RelativeSource.
2. У ICommand есть CommandParameter, в который можно передать SelectedItem какого-либо контрола.

И в данном случае даже пофиг, живёт логика в code-behind или где-то ещё.
А предложить подход в рамках MVVM кто-нибудь может?

Там всего-то дублирование данных у меня (мой пример кто-нибудь смотрел?). У меня такое ощущение, что я просто не так классы написал и что в рамках MVVM там должно всё разруливаться.
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633400
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Алексей Кпропущено...
У тебя проблема в первую очередь из-за того, что ты смешиваешь в одних классах логику и данные. Помни:

1. Биндинг можно делать через RelativeSource.
2. У ICommand есть CommandParameter, в который можно передать SelectedItem какого-либо контрола.

И в данном случае даже пофиг, живёт логика в code-behind или где-то ещё.
А предложить подход в рамках MVVM кто-нибудь может?

Там всего-то дублирование данных у меня (мой пример кто-нибудь смотрел?). У меня такое ощущение, что я просто не так классы написал и что в рамках MVVM там должно всё разруливаться.А чем это не MVVM?
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633403
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Алексей Квдогонку: По сути, предлагается завести под логику в ICommand-ах отдельную ViewModel, если разместить это в code-behind религия не позволяет.
Зачем заводить два файла с кодом вместо одного?Где кто писал про "файл"?

user7320И почему логика только в командах? А в свойствах? А в OnPropertyChanged?Ну если надо - так надо, пиши обёртки...
...
Рейтинг: 0 / 0
Проблемы с иерархическими моделями представлений
    #38633483
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кuser7320пропущено...

А предложить подход в рамках MVVM кто-нибудь может?

Там всего-то дублирование данных у меня (мой пример кто-нибудь смотрел?). У меня такое ощущение, что я просто не так классы написал и что в рамках MVVM там должно всё разруливаться.А чем это не MVVM?
"Обычно" модель представления (МП) "пробрасывает" данные модели в представление. Т. е. в свойствах МП в геттерах делается вызов свойств модели и результат возвращается:

get { return model.Property; }

В сеттерах же точно также присваивается значение не свойству МП, а по сути свойству М (модели):

set { model.Property = value; }

Т. е. в МП модель является backing field, хранящим свойства МП.

Но это для простых случаев - когда нет никакой иерархии в моделях и моделях представлений.

А когда иерархия, то ни в каких джошесмитовских букварях ничего такого не разобрано. И вообще нигде не разобрано. А я задал ПРОСТОЙ ВОПРОС: модель, у которой поля - другие модели. Как для неё сделать МП с таким же включением - МП, с полями в виде других МП?

У меня получилось так


Код: 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.
class ViewModel3
{
    private Model3 m3;
    private ViewModel1 vm1;
    private ViewModel2 vm2;

    public ViewModel1 VM1
    {
        get { return vm1; }
        set 
        {
            vm1 = value;
            m3.M1.N = value.N;
            //m3.M1 = value.M1;
        }
    }

    public ViewModel3(Model3 m3)
    {
        this.m3 = m3;
        this.vm1 = new ViewModel1(this.m3.M1);
        this.vm2 = new ViewModel2(this.m3.M2);
    }
}



Здесь данные дублируются, а не пробрасываются. При этом М по-прежнему является backing field:

private Model3 m3;

Но ведь надо ещё и модели Model1 и Model2 как-то представлять. Поэтому для них ещё по полю создаю - vm1 и vm2. И в каждом таком поле тоже хранится по копии модели. Итого уже две копии каждой из составляющих моделей хранится во ViewModel3. Например, модель Model1 хранится - одна в

private Model3 m3

в виде m3.M1, а другая - в

private ViewModel1 vm1;

в виде vm1.m1.

Теперь когда у меня прилетает новая ViewModel1 в сеттер ViewModel3, я должен обновить модель и там, и там.

В результате сеттер превращается не в простое

Код: c#
1.
set { model.Property = value; }



а в монструозное и костыльное

Код: c#
1.
2.
3.
4.
5.
6.
set 
{
    vm1 = value;
    m3.M1.N = value.N;
    //m3.M1 = value.M1;
}



Причём никакие эти про такие проблемы не пишут. Я так понимаю, что они знают какой-то секрет или для них настолько элементарно представить мои иерархические модели в моделях представления, что они даже не считают нужным про этом упомянуть. Бубнят про какие-то слои, про "слишком много логики в VM", а про то, с чем должны сталкиваться каждый день и что я привёл - ни слова.
...
Рейтинг: 0 / 0
25 сообщений из 96, страница 1 из 4
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Проблемы с иерархическими моделями представлений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]