2010-05-11 4 views
10

(честно говоря, я искал и читал все «связанные вопросы», которые казались релевантными - я надеюсь, что я не «пропустил» этот вопрос из другого места, но здесь идет ...)Где я должен установить DataContext - код позади или xaml?

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

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

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

ответ

2

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

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

0

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

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

+0

уверен, что это то, что я ищу ... Я лично предпочитаю устанавливать его в xaml. для меня настройка его в коде позади становится сложной, поскольку вы * можете * установить datacontext «где угодно», поэтому иногда отслеживание «где» является болью ... это больше похоже на тип «причин использовать один путь» или другой «я ищу ...(в этом случае «издеваемыми данными» в смешении является «причина») – dovholuk

4

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

т.е.

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

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

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

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

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

+0

Я confused - сообщение Стефана ясно показывает (хорошо для меня в любом случае), как установить datacontext через xaml, так что вы можете уточнить, что вы имеете в виду, когда говорите вы не можете установить datacontext в xaml, пожалуйста? спасибо – dovholuk

+1

@dovholuk: Обратите внимание на мое использование контекста данных «in». Да, вы можете назначить объект свойству DataContext в Xaml. Но поскольку ответ Стефана показывает все, что на самом деле назначается, это «привязка». сам по себе не является истинным «контекстом данных». Фактический объект, назначенный как «контекст данных», выполняется в коде в свойстве «ViewModel» объекта, назначенного статическому ресурсу, называемому «Locator». – AnthonyWJones

Смежные вопросы