Update
Что заставило меня поставить еще один ответ был неумение применить принятый ответ на мой проект , который с помощью Prism 6,
но после сдачи оригинальный ответ (см это ниже) и обсуждение в комментариях я обнаружил, что основной проблемой было следующее: Призмы 6 изменили пространства имен некоторых классов, все классы, которые использовались в принятом ответе, все еще существуют в Призма 6, но в других библиотечных пространствах и пространствах имен
Итак, если вы используете Pris м 6, вы можете применить принятый ответ с этими изменениями
первой замены тех namesapces
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:pi="clr-namespace:Microsoft.Practices.Prism.Interactivity;assembly=Microsoft.Practices.Prism.Interactivity"
xmlns:pit="clr-namespace:Microsoft.Practices.Prism.Interactivity.InteractionRequest;assembly=Microsoft.Practices.Prism.Interactivity"
со следующими пространствами имен
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:prism="http://prismlibrary.com/"
второй обновляют XAML как следующие
<Button Content="Options" Command="{Binding OpenConnectionOptionsCommand}">
<i:Interaction.Triggers>
<prism:InteractionRequestTrigger SourceObject="{Binding OptionSettingConfirmationRequest, Mode=OneWay}" >
<prism:PopupWindowAction>
<prism:PopupWindowAction.WindowContent>
<views:CustomPopupView />
</prism:PopupWindowAction.WindowContent>
</prism:PopupWindowAction>
</prism:InteractionRequestTrigger>
</i:Interaction.Triggers>
</Button>
ПРИМЕЧАНИЕ 1
Убедитесь, что вид, который вы используете (в приведенном выше примере <views:CustomPopupWindow>
), не является окном или вы получите исключение.
Примечание 2
Эти изменения необходимы ТОЛЬКО в случае, если вы используете Prism 6. потому что (как я уже сказал в оригинальный ответ ниже), которые DLLs используемые принятым ответом является осуждается в Prism 6.
Примечание 3
Убедитесь, что вы обращаетесь к Prism.Wpf
DLL, которые могут быть downloaded from Nuget.
Оригинал ответа
принял ответ направлен на
Призма 5, он использует
this library который
осуждается в
Prism 6.
На самом деле the article which you reference в вашем вопросе было очень полезно (по крайней мере, для меня), и это не сбой.
Я попробую обобщить эту статью.
ViewModel
public class ViewModel : BindableBase
{
public ViewModel()
{
_showWindowCommand = new DelegateCommand(ShowWindow);
_interactionRequest = new InteractionRequest<Confirmation>();
}
private readonly DelegateCommand _showWindowCommand;
private InteractionRequest<Confirmation> _interactionRequest;
public ICommand ShowWindowCommand
{
get { return _showWindowCommand; }
}
public IInteractionRequest InteractionRequest
{
get { return _interactionRequest; }
}
private void ShowWindow()
{
_interactionRequest.Raise(
new Confirmation(),
OnWindowClosed);
}
private void OnWindowClosed(Confirmation confirmation)
{
if (confirmation.Confirmed)
{
//perform the confirmed action...
}
else
{
}
}
}
XAML
<Button Command="{Binding ShowWindowCommand}" Content="Show Window" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="Raised" SourceObject="{Binding InteractionRequest}">
<i:EventTrigger.Actions>
<local:ShowWindowAction></local:ShowWindowAction>
</i:EventTrigger.Actions>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
и вам нужно будет использовать эти пространства имен
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:local="clr-namespace:The namespace which contains the ShowWindowAction">
Action Trigger
using System;
using Prism.Interactivity.InteractionRequest;
using System.Windows.Interactivity;
using System.Windows;
public class ShowWindowAction : TriggerAction<FrameworkElement>
{
protected override void Invoke(object parameter)
{
InteractionRequestedEventArgs args = parameter as InteractionRequestedEventArgs;
if (args != null)
{
Confirmation confirmation = args.Context as Confirmation;
if (confirmation != null)
{
// Replace ParametersWindow with your own window.
ParametersWindow window = new ParametersWindow();
EventHandler closeHandler = null;
closeHandler = (sender, e) =>
{
window.Closed -= closeHandler;
args.Callback();
};
window.Closed += closeHandler;
window.Show();
}
}
}
}
Объяснение
- Вам нужно
Prism.Core
и Prism.Wpf
DLLs (по крайней мере), чтобы сделать этот код работать. Метод Invoke
ShowWindowAction
, который действительно отобразит окно.
- вы можете обработать закрытие окна в
OnWindowClosed
, которое мы передали ему как ответный вызов классу ShowWindowAction
, и мы назвали его оттуда, когда окно действительно закрыто.
В чем разница? 'PopupWindowAction' все еще присутствует в Prism 6 (https://github.com/PrismLibrary/Prism/blob/master/Source/Wpf/Prism.Wpf/Interactivity/PopupWindowAction.cs) и как' IConfirmation', так и 'Confirmation' классы все еще присутствуют в обеих структурах. За исключением того, что Prism5 был (на тот момент), который все еще поддерживается MS и Prims6, не находится в руках сообщества, ничего из использования классов не изменилось. Нет необходимости в собственном 'TriggerAction', за исключением случаев, когда вам нужно что-то, что' PopupWindowAction' не предлагает (т.е. ленивая загрузка, для которой я требовал новый просмотр и режим просмотра при каждом вызове) – Tseng
@ Ценг да, вы правы, я думаю, что различия это пространства имен, классы все еще существуют, но пространства имен изменились. Кроме того, я просто предоставил другой способ, используя пользовательский 'ActionTrigger' *, возможно, это может быть полезно для других *, также я использую' i: EventTrigger' вместо 'InteractionRequestTrigger', но да, в общем, наши ответы очень близки друг к другу , –
@Tseng см. Новое обновление для ответа. –