Модель представления не должна обрабатывать элементы вида. Диалог является элементом представления.
Модель представления может инициировать ввод данных пользователем, вызывая событие, например, событие ошибки с моделью данных в качестве аргументов события. Представление, зарегистрированное для события, показывает диалоговое окно для сбора ввода пользователя и сохранения его в ранее полученной модели данных. Затем представление выполняет команду модели представления для передачи обратно модели данных.
Вместо события вы также можете привязать представление к свойству модели представления, например, типа bool
. При изменении свойства откройте диалоговое окно и верните результат, используя ICommand
.
. Альтернативно, пусть модель представления предоставляет флаг, например, HasException
и свойство ExceptionDialogModel
, которое можно использовать для привязки пользовательского диалога илисформироваться. Затем создайте простой модальный диалог самостоятельно:
ExampleDialog
<Grid x:Name="ExampleDialog"
Visibility="Visible"
Panel.ZIndex="100"
VerticalAlignment="Top">
<Rectangle Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}, Path=ActualWidth}"
Height="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}, Path=ActualHeight}"
Fill="Gray"
Opacity="0.7" />
<Grid Width="400"
Height="200">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="100" />
</Grid.RowDefinitions>
<Border Grid.RowSpan="2"
Background="LightGray"
BorderBrush="Black"
BorderThickness="1">
<Border.Effect>
<DropShadowEffect BlurRadius="5"
Color="Black"
Opacity="0.6" />
</Border.Effect>
</Border>
<TextBlock Grid.Row="0"
TextWrapping="Wrap"
Margin="30"
Text="I am a modal dialog and my Visibility or Opacity property can be easily modified by a trigger or a nice animation" />
<StackPanel Orientation="Horizontal"
Grid.Row="1"
HorizontalAlignment="Right"
Height="50">
<Button x:Name="OkButton"
Content="Ok"
Width="80" />
<Button x:Name="CancelButton"
Margin="30,0,30,0"
Content="Cancel"
Width="80" />
</StackPanel>
</Grid>
<Grid.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ExampleDialog"
Storyboard.TargetProperty="Visibility"
Duration="0">
<DiscreteObjectKeyFrame Value="{x:Static Visibility.Hidden}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Grid.Triggers>
</Grid>
Вы можете поместить Grid
в любом месте вашего Window
и переключать Visibility
. Он перекрывает родительский элемент Window
и имеет модальное поведение.
Привязывает DataContext
к ExceptionDialogModel
, чтобы данные отправлялись обратно через привязку TwoWay
. Используйте команду для запуска процедуры повтора (например, кнопку OK или Retry ).
Visibility
может связываться со свойством HasException
. Вы можете оживить этот диалог и придать ему любой вид и чувствовать, что вам нравится.