Кто устанавливает DataContext в Silverlight MVVM

Я ни в коем случае не разработчик C#, но похоже, что Вы должны к URL ЗАКОДИРОВАТЬ свою строку Base64 прежде, чем отправить его как URL.

9
задан 1 September 2009 в 19:29
поделиться

4 ответа

Это отличный вопрос, на который есть много ответов. Все зависит от того, как вы хотите спроектировать свое приложение. Например, я использую внедрение зависимостей для создания своего IViewModel, который, в свою очередь, создает мой IView, а мой IViewModel запускает IView.SetViewModel (this) в конструкторе.

Другие люди могут пожелать использовать более гибкий метод, установив DataContext в Xaml:

<UserControl.DataContext>
    <ns:CrazyViewModel />
</UserControl.DataContext>

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

Таким образом, на самом деле нет неправильного способа установить DataContext, при условии, что то, что у вас разделяет проблемы, является поддерживаемым, а также легко тестируемым.

6
ответ дан 4 December 2019 в 21:50
поделиться

У Шона Вильдермута есть отличный пост о том, что идет первым: View или ViewModel: http://wildermuth.com/2009/05/22/Which_came_first_the_View_or_the_Model

Мне нравится и я использую его концепцию брака, где сторонний класс создает и представление, и модель представления, а затем связывает их. У меня это сработало.

3
ответ дан 4 December 2019 в 21:50
поделиться

I use MVVM a lot in with Prism. In Prism I use Unity for dependecy injection. Therefore I have an interface for every class registered with Unity including the View. The IView interface has a method like this:

void SetViewModel(object viewModel);

The ViewModel calls this method at the end of its constructor, passing itself as a parameter:

 public ViewModel(IView view, ...) 
 {  
    ...   
   this._view=view;  
   this._view.SetViewModel(this);  
 }

In the View.xaml.cs the IView interface is implemented. This will be the only code I add to the codebehind of the view:

public partial class View:UserControl, IView
{
   public View()
   {
    ...
   }

   public SetViewModel(object viewModel)
   {
     this.DataContext = viewModel;
   }

}
0
ответ дан 4 December 2019 в 21:50
поделиться

Что касается моего собственного использования, ViewModel не знает View, или любой интерфейс в представлении. И большую часть времени View не знает своей ViewModel, даже если это менее важно. ВМ просто передается DataContext.

Это гарантирует, что VM и V останутся полностью независимыми. Ссылки устанавливаются через привязки, команды, поведение, триггеры и так далее. Даже если виртуальная машина часто тесно связана с данным представлением, я стараюсь сделать его как можно более общим, чтобы я мог переключать соответствующее представление и / или адаптировать поведение представления без необходимости обновлять виртуальную машину, кроме случаев, когда архитектурная ссылка между V и M происходит удар!

0
ответ дан 4 December 2019 в 21:50
поделиться
Другие вопросы по тегам:

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