WPF MVVM подводные камни
От: s_aa Россия  
Дата: 20.04.18 07:01
Оценка:
Наверное я что-то не так делаю, куда копать? Пока дерево элементов статично, все вроде получается. Но в сложных формах приходится его динамически генерить, а не только при инициализации, но и в ходе работы программы. Приходится держать в ViewModel ссылку на View. Все сильно усложняется. Забить на MVVM, биндинг и делать как в WinForms? Не хотелось бы.
Жизнь не обязана доставлять удовольствие. Достаточно отсутствия страданий.
Re: WPF MVVM подводные камни
От: Sinatr Германия  
Дата: 20.04.18 07:07
Оценка:
Здравствуйте, s_aa, Вы писали:

А код/xaml показать не судьба?

_>Наверное я что-то не так делаю, куда копать?


Наверное. От сюда и до туда копайте.
---
ПроГLамеры объединяйтесь..
Re[2]: WPF MVVM подводные камни
От: s_aa Россия  
Дата: 20.04.18 09:18
Оценка:
S>А код/xaml показать не судьба?

Вопрос по архитектуре, конкретно с этим кодом у меня проблем нет. Публикация конкретного кода тут сведется к обсуждению кривых рук автора, и ноль помощи по конкретному вопросу.
Жизнь не обязана доставлять удовольствие. Достаточно отсутствия страданий.
Re[3]: WPF MVVM подводные камни
От: MegaMozg Россия  
Дата: 20.04.18 10:26
Оценка:
Здравствуйте, s_aa, Вы писали:

S>>А код/xaml показать не судьба?


_>Вопрос по архитектуре, конкретно с этим кодом у меня проблем нет. Публикация конкретного кода тут сведется к обсуждению кривых рук автора, и ноль помощи по конкретному вопросу.


все там нормально в MVVM. вы конкретнее проблему опишите
Re[4]: WPF MVVM подводные камни
От: s_aa Россия  
Дата: 20.04.18 10:54
Оценка:
MM>все там нормально в MVVM. вы конкретнее проблему опишите

Создал View, передал ему в качестве DataContext ViewModel. Во время работы программы срабатывает Command во ViewModel. Нужно перестроить дерево элементов во View. Как это сделать не имея во ViewModel ссылки на View?
Жизнь не обязана доставлять удовольствие. Достаточно отсутствия страданий.
Re[5]: WPF MVVM подводные камни
От: MegaMozg Россия  
Дата: 20.04.18 11:09
Оценка:
Здравствуйте, s_aa, Вы писали:

MM>>все там нормально в MVVM. вы конкретнее проблему опишите


_>Создал View, передал ему в качестве DataContext ViewModel. Во время работы программы срабатывает Command во ViewModel. Нужно перестроить дерево элементов во View. Как это сделать не имея во ViewModel ссылки на View?


INotifyPropertyChanged и ObservableCollection делу не помогут?
Re[5]: WPF MVVM подводные камни
От: Sinatr Германия  
Дата: 20.04.18 11:36
Оценка:
Здравствуйте, s_aa, Вы писали:

_>срабатывает Command во ViewModel. перестроить дерево элементов во View.


Много способов. Идея заключается в том, чтобы разбить View (повторяющиеся и динамические части), каждая часть отрисовуется соответствующей ViewModel, используя data template или используя специальное свойсвто какого-либо элемента, DataTemplateSelector, DataTrigger в стиле с подменой ControlTemplate и тд.

_> Публикация конкретного кода тут сведется к обсуждению кривых рук автора, и ноль помощи по конкретному вопросу


Был опыт? Или почему так не оптимистично?

Все ошибаются. Не пытайтесь скрывать ваш код. Самый быстрый способ научиться — это когда кто-то исправляет ваши же ошибки.

Причина плохого отношения чаще всего заключается в вопросе. На StackOverflow даже ввели голосование, чтобы плохие вопросы автоматизированно закрывать, потому что это — большая проблема.

Ваш вопрос был бы закрыт как "too broad". Потому что "хороший" ответ должен рассказать обо всех способах и нюансах, что по сути выльется в небольшую (или же большую) статью. Или же вообще как оффтопик, потому что вы жалуетесь, что некий код не работает, а код не показываете.

Покажите код, обьясните четко, что происходит и как вы хотите — и любой специалист покажет вам одно из оптимальных для заданных условий решение. Без заданных условий, как вы понимаете, решений — множество.
---
ПроГLамеры объединяйтесь..
Re[5]: WPF MVVM подводные камни
От: Mr.Delphist  
Дата: 20.04.18 13:04
Оценка:
Здравствуйте, s_aa, Вы писали:

MM>>все там нормально в MVVM. вы конкретнее проблему опишите


_>Создал View, передал ему в качестве DataContext ViewModel. Во время работы программы срабатывает Command во ViewModel. Нужно перестроить дерево элементов во View. Как это сделать не имея во ViewModel ссылки на View?


Вьюшное дерево должно строиться на основе какого-то свойства внутри viewmodel. Обновляем свойство — волшебным образом обновится и дерево (INotifyPropertyChanged-машинерия, вокруг которой каждый MVVM оборачивает свою иерархию базовых классов).
Re[6]: WPF MVVM подводные камни
От: s_aa Россия  
Дата: 20.04.18 13:17
Оценка:
MD>Вьюшное дерево должно строиться на основе какого-то свойства внутри viewmodel. Обновляем свойство — волшебным образом обновится и дерево (INotifyPropertyChanged-машинерия, вокруг которой каждый MVVM оборачивает свою иерархию базовых классов).

Спасибо кэп. Поправочка "уже существующее дерево". А если одни элементы надо удалить, другие добавить?
Жизнь не обязана доставлять удовольствие. Достаточно отсутствия страданий.
Re[6]: WPF MVVM подводные камни
От: s_aa Россия  
Дата: 20.04.18 13:18
Оценка:
S>Много способов. Идея заключается в том, чтобы разбить View (повторяющиеся и динамические части), каждая часть отрисовуется соответствующей ViewModel, используя data template или используя специальное свойсвто какого-либо элемента, DataTemplateSelector, DataTrigger в стиле с подменой ControlTemplate и тд.

Кое на какие мысли навели, буду думать спасибо.
Жизнь не обязана доставлять удовольствие. Достаточно отсутствия страданий.
Re[7]: WPF MVVM подводные камни
От: Qulac Россия  
Дата: 20.04.18 13:34
Оценка: 4 (1)
Здравствуйте, s_aa, Вы писали:

S>>Много способов. Идея заключается в том, чтобы разбить View (повторяющиеся и динамические части), каждая часть отрисовуется соответствующей ViewModel, используя data template или используя специальное свойсвто какого-либо элемента, DataTemplateSelector, DataTrigger в стиле с подменой ControlTemplate и тд.


_>Кое на какие мысли навели, буду думать спасибо.


Главные 3 вещи в WPF:
1. Байдинг
2. Как уже сказали data template и DataTemplateSelector
3. value converter

Этого практически достаточно, что бы сделать любой интерфейс, иногда только есть необходимость добавить элементам дополнительные свойства зависимости. Еще добавлю, что data template может так же содержать data template и использовать свой DataTemplateSelector, т.е. они могут быть вложенными друг в друга.
Программа – это мысли спрессованные в код
Re[7]: WPF MVVM подводные камни
От: Jack128  
Дата: 20.04.18 13:42
Оценка: 2 (1) +1
Здравствуйте, s_aa, Вы писали:

MD>>Вьюшное дерево должно строиться на основе какого-то свойства внутри viewmodel. Обновляем свойство — волшебным образом обновится и дерево (INotifyPropertyChanged-машинерия, вокруг которой каждый MVVM оборачивает свою иерархию базовых классов).


_>Спасибо кэп. Поправочка "уже существующее дерево". А если одни элементы надо удалить, другие добавить?


Это TemplateSelector'ами решается
Re[7]: WPF MVVM подводные камни
От: Mr.Delphist  
Дата: 20.04.18 18:10
Оценка:
Здравствуйте, s_aa, Вы писали:

_>Спасибо кэп. Поправочка "уже существующее дерево". А если одни элементы надо удалить, другие добавить?


А какая разница? Или Вы и создаёте его тоже ручками во вьюху? Так это не mvvm ни разу.

1) Делаем проперти у вьюмодели, проперти содержит необходимую иерархию элементов (возможно, тоже вьюмоделей, исходя из задачи)
2) Вьюха биндится к этому проперти. И как именно вьюха будет визуализировать контент — нашей вьюмодели глубоко фиолетово. Сколько и каких таких вьюх забиндилось на это проперти — нашей вьюмодели тоже глубоко фи.

Каждая вьюмодель отображает проперти так, как хочет. Это может быть дерево, или грид для элементов лишь верхнего уровня, или просто циферка, отображающая общее число элементов в этой иерархии, или максимальную глубину иерархии, и т.п.
Re[8]: WPF MVVM подводные камни
От: s_aa Россия  
Дата: 20.04.18 18:38
Оценка: -1
Ты не про то. Но спасибо за ответ, уже натолкнули на мысль.
Жизнь не обязана доставлять удовольствие. Достаточно отсутствия страданий.
Re[9]: WPF MVVM подводные камни
От: _Raz_  
Дата: 20.04.18 18:55
Оценка: -1
Здравствуйте, s_aa, Вы писали:

_>Ты не про то. Но спасибо за ответ, уже натолкнули на мысль.


Оба его ответа верны и относятся именно к твоей проблеме.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re: WPF MVVM подводные камни
От: Kolesiki  
Дата: 21.04.18 03:21
Оценка: :)
Здравствуйте, s_aa, Вы писали:

_>Забить на MVVM, биндинг и делать как в WinForms? Не хотелось бы.


А что ты такого сверхполезного имеешь, танцуя вокруг навязанного тебе MVVM?
Re[2]: WPF MVVM подводные камни
От: s_aa Россия  
Дата: 21.04.18 05:32
Оценка:
K>А что ты такого сверхполезного имеешь, танцуя вокруг навязанного тебе MVVM?

Красивая технология, эстетическое удовольствие получаю
Жизнь не обязана доставлять удовольствие. Достаточно отсутствия страданий.
Re[2]: WPF MVVM подводные камни
От: ylem  
Дата: 21.04.18 09:56
Оценка:
K>А что ты такого сверхполезного имеешь, танцуя вокруг навязанного тебе MVVM?

Зарплату? Возможность работать в команде и в проекте, где MVVM используют?
Re: WPF MVVM подводные камни
От: anatolym  
Дата: 23.04.18 10:51
Оценка: 6 (1)
Здравствуйте, s_aa, Вы писали:

1) Используешь библиотеку MVVMLight
2) Наследуешь свою ViewModel от ViewModelBase
3) В свойствах которые биндятся вызывается функцию RaisePropertyChanged()
4) В качестве команд используешь RelayCommand из пространства имен GalaSoft.MvvmLight.Wpf
5) Коллекцию объектов помещаешь в ObservableCollection
6) Этой коллекцией инициализируешь ListCollectionView который биндишь к ItemsSource. Для обновления вызываешь функцию Refresh.
7) Для элементов дерева можно создать отдельно иерархию объектов где базовый наследуется от ViewModelBase. Там же можно добавить такие свойства такие как, например, IsExpanded которые будут биндится к ItemContainerStyle.
Re: WPF MVVM подводные камни
От: barn_czn  
Дата: 19.09.18 20:58
Оценка:
Здравствуйте, s_aa, Вы писали:

_>Приходится держать в ViewModel ссылку на View. Все сильно усложняется. Забить на MVVM, биндинг и делать как в WinForms? Не хотелось бы.


ViewModel может общаться с View через события. Т.о. вью дергает методы вьюмодели, а вьюмодель генерит события. Все, двунаправленая связь есть.
Держать вью во вью модели — плохо, потому что вьюмодель не должна ничего знать о вью. На то она и ВЬЮ-модель.
Но если подумать то и это не совсем верно. Плохо ни то что вьюмодель держит вью. А то что она Знает про конкретный вью. Вот этого нельзя допускать.
Последнее время я для себя придумал патерн, что у вьюмоделей делаю свойство

object View {get;set;}

Т.о. вьюмодель по прежнему ничего не знает про вью. Принцип MVVM не нарушен. Но это дает много преимуществ на стороне вью.
Например у каждого вью есть какой то вью-контекст выше уровнем. И тогда получить вью по вьюмодели очень просто. Нет нужды какие то словари вести.

Еще способ. На уровне вьюмоделей вы сами можете абстрагироваться от вью тем интерфейсом какой сочтете нужным.

interface IView
{
//все нужные фичи которые вьюмодель требует от вью.
}

Так вы тоже не нарушите принцип что "вьюмодель не знает про вью".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.