ViewModel ответственность и всплывающее дочернее окно в Silverlight - PullRequest
0 голосов
/ 23 декабря 2010

С чего начать? Вопрос о двух разных способах достижения одной и той же вещи, и оба меня пахнут, поэтому мне нужен кто-то, кто скажет мне, есть ли лучший способ. Итак, у нас есть экран, который отображает данные в сетке данных. Когда пользователь щелкает значок в сетке данных, появляется модальное всплывающее окно (из Prism). Это можно сделать двумя известными мне способами, работая с SL в течение 2 недель. Чтобы придать больше фона, мы используем шаблон MVVM и у нас есть ViewModelLocator.

кнопка в сетке данных для каждой строки

<Button Width="16" Name="cmdEdit" Height="16" Margin="10,0,0,0" Style="{StaticResource ImageButtonStyle}" Click="cmdEdit_Click" CommandParameter="{Binding}">
         <Button.Content>
             <Image  Source="/Test.Application.Bid;component/Images/edit.png"/>
          </Button.Content>
</Button>

Первый способ - обработать клик из кода позади:

var p = new PopupChildWindowAction();
 var vml = new ViewModelLocator();
 var viewModel = vml["BidAgentEditView"] as BidAgentEditViewModel;
 var view = new BidAgentEditView();
 view.DataContext = viewModel;
 viewModel.BidAgent = ((Button) e.OriginalSource).CommandParameter as BidAgentDto;
 p.ChildWindow = view;
 p.ChildWindow.Show();

Второй способ - использовать InteractionRequestTriggers в xaml и команды на модели представления, подобные этой

кнопка в сетке данных

 <Button Width="16" Height="16" Margin="10,0,0,0" Style="{StaticResource ImageButtonStyle}" 
         prism:Click.Command="{Binding Source={StaticResource cc}, Path=DataContext.EditBidAgentCommand}" 
         prism:Click.CommandParameter="{Binding}">

в viewmodel ctor

this._editBidAgentRequest = new InteractionRequest<BidAgentEditViewModel>();

EditBidAgentCommand = new DelegateCommand<BidAgentDto>(editBidAgent, canEditBidAgent);

и обработчик для команды

 private void editBidAgent(BidAgentDto bidAgent)
 {
     _editBidAgentRequest.Raise(newBidAgentEditViewModel(bidAgent,_bidAgentDataService));
  }

Таким образом, представление вызывает команду для модели представления, которая разворачивается и вызывает запрос взаимодействия, который обрабатывается представлением, и это открывает дочернее окно. Может быть, я не понимаю MVVM, но это кажется слишком сложным способом взаимодействия с пользователем. Плюс тот факт, что у меня есть что-то, называемое "Взаимодействие" на модели представления, заставляет меня чувствовать себя грязным. Как вы думаете, есть ли лучший способ сделать это без необходимости объявлять эти запросы взаимодействия в модели представления, что полностью выполняется в xaml, без необходимости обрабатывать это в модели представления?

Сначала от кода, чтобы понять, что происходит:

1 Ответ

3 голосов
/ 23 декабря 2010

Как вы, наверное, знаете, Prism предлагает запросы взаимодействия для такого сценария.Помните, что виртуальная машина должна обрабатывать часть бизнес-логики представления.Приказ об отображении всплывающего окна при возникновении действия является частью обязанностей виртуальных машин.

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

Подводя итог, запросы на взаимодействие кажутся мне довольно аккуратными.

...