Где я должен установить код DataContext или xaml?

(честно говоря, я искал и читал все "связанные вопросы", которые казались релевантными - надеюсь, я не "пропустил" этот вопрос из другого места, но здесь идет...)

Существует два разных способа (по крайней мере) для установки DataContext. Можно использовать XAML или использовать код позади.

Что такое "лучшая практика" и почему?

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

Ответ 1

Я думаю, что это зависит от того, к чему вы устанавливаете DataContext, и в конечном итоге к личным предпочтениям.

Я лично всегда делаю это в коде позади моих просмотров, потому что я нахожу его в целом чище, и именно так меня учили MVVM. Еще одна вещь, о которой следует помнить, - это то, что вам может понадобиться изменить свой файл данных в зависимости от того, с чем вы работаете. Если это так, то это намного проще/проще в коде, чем в XAML.

Ответ 2

Третий способ, которым вы можете воспользоваться, - использовать службу локатора. Обычно у меня есть один класс, который отвечает за создание всего моего DataContext (VM в большинстве случаев для меня), и я создаю экземпляр этого класса в App.xaml Resources. Затем я привязываю DataContext в XAML каждой отдельной страницы.

то есть.

<Page DataContext="{Binding ViewModel,Source={StaticResource Locator}}" >

Ответ 3

Как вы можете видеть по ответам, до сих пор мнение разделено. По правде говоря, нет лучшей практики (я получаю пчелу в своем бонусе о дискуссиях о "лучшей практике" в мире Silverlight, ее слишком молодой для лучшей практики, чтобы быть правдивым.)

Реальность на самом деле заключается в том, что вы не можете установить "контекст данных" в Xaml. Если вы фактически не создадите экземпляр объекта, например:

<UserControl>
  <UserControl.DataContext>
    <local:MyDataProviderThing />

В конечном итоге что-то внешнее должно напрямую или косвенно назначать свойство DataContext через другое свойство или через привязку (как в ответе Стефана). Его внешний контекст, который диктует, имеет ли смысл делать это в Xaml или нет. Многие решения MVVM используют привязку в Xaml, в некоторых случаях просто для того, чтобы избежать необходимости иметь какой-либо код вообще в коде, а не быть "лучшим". Другие настроили DataContext в коде, используя базовый класс, из которого вы управляете.

Ответ 4

DataContext пользовательского элемента управления/представления, который я предполагаю? Одним из преимуществ настройки контекста данных в коде позади является доступность инъекции зависимостей. Ваш контейнер DI может заботиться о любых зависимостях для вас динамически во время выполнения.

С помощью этого шаблона я часто устанавливаю представление Blend design DataContext в xaml, используя d: DataContext. "Проектная версия" может предоставлять макетные данные для использования в Blend, тогда как истинная реализация разрешена во время выполнения.