1

Добрый вечер. Скажите пожалуйста как правильно сделать пользовательский элемент, у которого можно например динамически что-то изменить в процессе работы программы и чтобы это было MVVM? Например как на картинке ниже, создаётся пользовательский контрол и при нажатии на определённую кнопку меняется, добавляя "в себя" checkbox и меняя при добавлении каждого checkbox высоту на +15 пикселей. Подскажите пожалуйста как это грамотно организовать?

введите сюда описание изображения

  • ItemsControl и привязка его к коллекции VM-объектов? – VladD Apr 30 '17 at 20:17
  • А изменение высоты через layout management по идее. Если совсем никак, то через конвертер. – VladD Apr 30 '17 at 20:18
  • @Vlad Чтобы не было путаницы, а коллекция vm-объектов по отношению к структуре окну программы или к структуре user control? – alex-rudenkiy Apr 30 '17 at 20:21
  • Ну, я имел в виду, что каждому checkbox'у соответствует один VM-объект в коллекции (которая первоначально пуста). А синий прямоугольник, который должен увеличивать высоту, пусть бы привязывался к высоте списка элементов. – VladD Apr 30 '17 at 20:24
  • Подождите а список элементов, это не массив(list) внутри кода? Это по сути графический элемент? – alex-rudenkiy Apr 30 '17 at 20:30
  • Всё я понял насчёт списка, это тупой был вопрос ))) – alex-rudenkiy Apr 30 '17 at 20:36
  • @VladD ну я авто-подгонку* сделал, а вот самое интересное как сделать динамическое добавление? Я как понимаю, мне для начала нужно создать в модели прототип контрола и внутри этого класса создать какой нибудь List чтобы хранить мои динамически создаваемые checkbox. Ну вот когда я подготовил Model для моего контрола я его уже стараюсь при нажатии на кнопку (создать контрол) и выполнении определённой ICommand (make_control) в ViewModel, добавить его в хранилище (List) созданных контролов в Model, но я хз как это провернуть Bindingом?

    *Тупо сделал авто ширину для всего :)

    – alex-rudenkiy May 01 '17 at 09:01
  • Ну, вам не обязательно иметь модельный объект для checkbox'ов. Смотрите, нужно ли это вам по сути. А вот по VM-объекту на checkbox придётся завести. Теперь, вы выставляете ICommand, например, RelayCommand (если у вас её ещё нет, подсмотрите тут), которая определена в VM, и при выполнении добавляет в ObservableColection<CheckVM> новый экземпляр. – VladD May 01 '17 at 10:33
  • @VladD извините за тупой вопрос, а в чём отличие класса в вашем примере ViewModel от Model. То-есть ViewModel по сути должна служить по сути передатчиком данных от графического представления (например edit) в хранилище данных (пусть содержимое edit хранит какой нибудь string) Model.

    P.S. Кстати хотел у вас спросить, а Model же по идее хранит всего лишь структуру данных, но не данные, а где хранить и загружать данные?

    – alex-rudenkiy May 01 '17 at 10:43
  • Ох, это очень большой и сложный вопрос. Вкратце — View привязывается к VM, а модель не видит вовсе. VM может собержать данные, т. к. модель вполне имеет право бежать в левом thread'е. И да, модель тоже имеет право содержать данные. А длинный ответ с подробностями вот тут: https://ru.stackoverflow.com/a/379331/10105 – VladD May 01 '17 at 10:53

0 Answers0