С чего начать? Вопрос о двух разных способах достижения одной и той же вещи, и оба меня пахнут, поэтому мне нужен кто-то, кто скажет мне, есть ли лучший способ. Итак, у нас есть экран, который отображает данные в сетке данных. Когда пользователь щелкает значок в сетке данных, появляется модальное всплывающее окно (из 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, без необходимости обрабатывать это в модели представления?
Сначала от кода, чтобы понять, что происходит: