WPF - Пользовательский элемент управления должен иметь свой собственный ViewModel?

Удалите for loop и используйте метод forEach () , чтобы добавить прослушиватель щелчков для каждого элемента и извлечь textContent из каждого figcaption внутри элемента .


Проверьте и выполните следующий фрагмент кода для практического примера того, что я описал выше:

function hello(d) { alert("" + d) }

var images = document.querySelectorAll('.block-image_carousel-single > figcaption');

images.forEach(image => {
  image.addEventListener('click', function(e) {
    e.preventDefault();
    hello(image.textContent);
  }, false);
});

27
задан CJBS 24 March 2017 в 23:12
поделиться

4 ответа

Это не вопрос «да» или «нет». Это зависит от того, дает ли вам дополнительные модели представления лучшую ремонтопригодность или тестируемость. Нет смысла добавлять модели представлений, если это ничего вам не даст. Вам нужно будет оценить, окупаются ли накладные расходы для вашего конкретного случая использования.

15
ответ дан 28 November 2019 в 04:36
поделиться

каждый пользовательский элемент управления [должен] иметь свой собственный ViewModel, или окно должно в целом иметь только один ViewModel?

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

Ваш UserControls должен НЕ , имеют ViewModels, специально разработанный для них.

проблема, это не вопрос, который задали .

я согласился бы с общим чувством, что, когда Вы пишете UserControl, общедоступный API управления не должен включать создание также тип модели представления, который специально предназначен, чтобы использоваться для того управления. Клиентский код должен быть в состоянии использовать безотносительно модели представления он хочет.

, Но, который не устраняет идею, что "каждый пользовательский элемент управления [мог] бы иметь свой собственный ViewMomdel" . Существует по крайней мере два очевидных сценария, о которых я могу думать, где ответ на это был бы "да, модель представления для каждого пользовательского элемента управления":

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

    В этом сценарии, объект модели представления не "специально разработан для них" (так никакое противоречие с сомнительным ответом), но, конечно, имеет место, что каждый пользовательский элемент управления имеет свою собственную модель представления (создание ответа на фактический вопрос "да, каждый пользовательский элемент управления может иметь свою собственную модель представления").

  2. пользовательский элемент управления реализация преимущества от, или даже требует, структура данных модели представления специально предназначенный для [1 111] пользовательский элемент управления. Эта структура данных модели представления не была бы представлена клиентскому коду; это - деталь реализации, и как таковой был бы скрыт от клиентского кода с помощью пользовательского элемента управления. Но, который, конечно, все еще был бы структурой данных модели представления "специально разработанный для [1 112]" тот пользовательский элемент управления.

    Этот сценарий ясно не проблематичен вообще, который непосредственно противоречит заявлению, что "Ваш UserControls должен НЕ , имеют ViewModels, специально разработанный для них".

Теперь, я не полагаю, что это было когда-либо намерение автора того ответа для исключения любого из этих сценариев. Но проблема, люди, которые пытаются учиться, WPF не может иметь достаточного количества контекста для распознавания различия, и таким образом может неправильно сделать вывод относительно пользовательских элементов управления и просмотреть модели, на основе этого решительного, высоко-upvoted, и вводящий в заблуждение ответ.

Это - моя надежда, что путем представления этой альтернативной точки наблюдения как точку разъяснения и ответа на исходный вопрос менее узки просматриваемым способом, у тех, кто нашел этот вопрос при получении дополнительной информации о WPF, будут лучший контекст и лучшая идея и когда модель представления могла бы быть реализована характерная для пользовательского элемента управления и когда это не должно быть.

2
ответ дан 28 November 2019 в 04:36
поделиться

Я бы сказал, что каждый пользовательский элемент управления должен иметь свою собственную ViewModel, потому что это позволит вам повторно использовать пару ViewModel / UserControl в новых созвездиях в будущем.

Насколько я понимаю, ваше окно представляет собой составную часть пользовательских элементов управления, поэтому вы всегда можете создать ViewModel, который объединяет все отдельные ViewModel для каждого из пользовательских элементов управления. Это даст вам лучшее из обоих миров.

10
ответ дан 28 November 2019 в 04:36
поделиться

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

В качестве дополнительного бонуса ваше приложение будет более подходящим для развития до более архитектурно обоснованной модели композиции, чем та, которая предоставляется структурами Prism или Caliburn, если возникнут требования приложения.

1
ответ дан 28 November 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: