WPF: как сигнализировать, чтобы событие от ViewModel Просмотрело без кода в codebehind? [дубликат]

Я нашел, что XSLT является довольно трудным работать с.

у меня был опыт при работе над системой, несколько подобной той, которую Вы описываете. Моя компания отметила, что данные, которые мы возвращали из "среднего уровня", были в XML, и что страницы должны были быть представлены в HTML, который мог бы также быть XHTML, плюс они услышали, что XSL был стандартом для преобразования между форматами XML. Так "архитекторы" (которым я имею в виду людей, которые думают глубокие мысли дизайна, но по-видимому никогда не кодируют), решил, что наш передний уровень будет реализован путем записи сценариев XSLT, которые преобразовали данные в XHTML для дисплея.

выбор оказался имеющим катастрофические последствия. XSLT, это складывается, является болью для записи. И таким образом, все наши страницы было трудно записать и поддержать. Мы сделали бы намного лучше для использования JSP (это было в Java), или некоторый аналогичный подход, который использовал один вид разметки (угловые скобки) для выходного формата (HTML) и другой вид разметки (как < %... %>) для метаданных. Самая запутывающая вещь о XSLT состоит в том, что он записан в XML, и он переводит от XML до XML..., довольно трудно сохранить все 3 различных XML-документа прямо в уме.

Ваша ситуация немного отличается: вместо того, чтобы создать каждую страницу в XSLT, как я сделал, только необходимо записать один бит кода в XSLT (код для преобразования из шаблонов для отображения). Но это кажется, что Вы, возможно, столкнулись с тем же видом трудности, которую я сделал. Я сказал бы, что попытка интерпретировать простой основанный на XML DSL (предметно-ориентированный язык) как Вы делает, не одна из сильных сторон XSLT. (Хотя это, CAN делает задание..., в конце концов, это полно по Тьюрингу!)

Однако, если то, что Вы имели, было более простым: у Вас есть данные в одном формате XML и требуемый для создания простых изменений к нему - не полностраничное описание DSL, но некоторые простые простые модификации, тогда XSLT является превосходным инструментом с этой целью. Это декларативно (не процедурный), природа является на самом деле преимуществом с этой целью.

- Michael Chermside

40
задан Tomáš Kafka 12 December 2009 в 18:42
поделиться

3 ответа

Some comments:

  • You can use the weak event pattern to ensure that the view can be GC'd even if it is still attached to the view model's event
  • If you're already switching multiple VMs in for the one view, wouldn't that be the ideal place to attach/detach the handler?
  • Depending on your exact scenario, you could just have the VM expose a state property which the view uses as a trigger for animations, transitions, and other visual changes. Visual state manager is great for this kind of thing.
3
ответ дан 27 November 2019 в 01:58
поделиться

Like adrianm said, when you trigger your animation off a bool property you are actually responding to an event. Specifically the event PropertyChanged which the WPF subsystem. Which is designed to attach/detach correctly to/from so that you don't leak memory (you may forget to do this when wiring an event yourself and cause a memory leak by having a reference active to an object which otherwise should be GCed).

This allows you to expose your ViewModel as the DataContext for the control and respond correctly to the changing of properties on the datacontext through databinding.

MVVM is a pattern that works particularly well with WPF because of all these things that WPF gives you, and triggering off a property change is actually an elegant way to use the entire WPF subsystem to accomplish your goals :)

0
ответ дан 27 November 2019 в 01:58
поделиться

Более общий вопрос, который следует задать: «Почему я пытаюсь обработать это событие в моей ViewModel?»

Если ответ имеет какое-либо отношение к вещам, предназначенным только для просмотра, таким как анимация, я бы сказал, что ViewModel не должен знать об этом: код позади (при необходимости), Data / Event / PropertyTriggers и новые конструкции VisualStateManager будут служить вам намного лучше и поддерживать четкое разделение между View и ViewModel.

Если что-то должно «произойти» в результате события, то вы действительно хотите использовать шаблон Command - либо используя CommandManger, обрабатывая событие в программном коде и вызове команды в модели представления или с помощью прикрепленных поведений в библиотеках System.Interactivity.

В любом случае вы хотите, чтобы ваша ViewModel оставалась «чистой» как вы можете - если вы видите там что-то, относящееся к View, вы, вероятно, делаете это неправильно. :)

0
ответ дан 27 November 2019 в 01:58
поделиться
Другие вопросы по тегам:

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