MVVM и пользовательские элементы управления? - PullRequest
2 голосов
/ 06 октября 2011

Я работаю над приложением PRISM с модулями, MVVM и так далее. Теперь я хорошо понимаю ПРИЗМУ и понимаю ценность MVVM. Все эти вещи хороши, чтобы обеспечить ценность для бизнеса , которая проистекает из тестируемости, "однородности" и т. Д.

Но теперь я застрял с некоторыми проблемами взаимодействия. Я уже часами пытался понять, как настроить фокус в Silverlight через MVVM. Все это дополнительные поведения, прикрепленные свойства, триггеры. Это просто похоже на кучу ненужного кода с MVVM, являющимся основной причиной.

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

Итак, вопрос в том ... Оправдано ли использование выделенного кода на изолированных островках, таких как элементы управления, и сохранение MVVM и TDD для реального кода, который приносит ценность для бизнеса?

Есть ли строка, где вы говорите "MVVM здесь не будет использоваться"?

1 Ответ

4 голосов
/ 06 октября 2011

Я не вижу абсолютно ничего плохого в использовании Code Behind при условии, что код связан со специфическими для вида свойствами, такими как настройка Focus.Ваша ViewModel никогда не должна знать или заботиться о том, кто или что находится в фокусе, поскольку это концепция View-Specific.

Обычно я создаю UserControls двумя способами: они либо создаются для конкретной модели, либо ViewModel,или они должны быть универсальными и иметь значения, предоставленные тем, кто их вызывает.

В случае с первым, например, если бы я хотел SearchResultsPopup, я бы собрал UserControl, ожидающий что-то вродеSearchResultsViewModel как DataContext.

Например, мой UserControl будет ожидать найти следующие свойства в своем DataContext и будет использовать их в привязках для построения представления.

  • ObservableCollection<SearchResult> Results
  • SearchResult SelectedResult
  • bool IsOpen
  • ICommand OkCommand
  • ICommand CancelCommand

Затем я мог бы использовать UserControl следующим образом:

<local:SearchResultsPopup DataContext="{Binding MySearchResultsVM}" />

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

Итак, в этом примере у меня будут DependencyProperties для

  • bool IsOpen
  • ICommand OkCommand
  • ICommand CancelCommand

И мой XAML будет выглядеть примерно так:

<local:GenericPopup local:GenericPopup.IsOpen="{Binding IsPopupOpen}"
                    local:GenericPopup.SaveCommand="{Binding SavePopupCommand}"
                    local:GenericPopup.CancelCommand="{Binding HidePopupCommand}">

    <local:MySearchResultsView ... />
</local:GenericPopup>

Таким образом, ваш UserControl является либо отражением вашей ViewModel (то есть он становится представлением), либо ему предоставляются значения посредствомПосмотреть.ViewModel не волнует в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...