如何正确地从WPF MVVM中的对话框获取输出?

我试图在互联网上找到问题的答案,但是没有一个答案让我满意。我正在编写WPF应用程序,并且正在尝试实现对话框机制。我有一个简单的ViewModel,当发生某些事件时,我想显示一个对话框,从中收集一些输出数据,并将其存储在“父”视图模型中。 我在视图模型中的方法如下:

urlpatterns = [
    path("admin/",admin.site.urls),path("",include("main.urls")),]

ShowDialog方法的实现

    private void Expand()
    {

        ...

        catch(ArgumentNullException)
        {

            Shrink();

            var errorDialogVM = new DialogVM(new Dialog() { Type = DialogType.Error,Message = $"Unauthorized access to \"{FileManager.GetDirectoryName(Path)}\" directory!" });

            DialogService.ShowDialog(errorDialogVM);

            //Here i need output from dialog

        }

    }

现在,让我们假设我需要对话框中的一些数据。如何以正确的方式将其传递给ViewModel?

zhaofc 回答:如何正确地从WPF MVVM中的对话框获取输出?

我相信您正在这样做。您应该将对视图模型的引用传递给对话框,而不是相反,因为视图模型应该是独立的并且不了解视图的机制。另一方面,对话框知道需要设置哪些视图模型属性。因此将类似于以下内容:

{{1}}
,

视图模型不应处理视图元素。对话框是视图元素。
视图模型可以通过引发和事件(例如将数据模型作为事件args的错误事件)触发用户输入。已注册到事件的视图显示一个对话框,以收集用户输入并将其存储在先前接收的数据模型中。然后,视图在视图模型上执行命令以传回数据模型。

除了事件之外,您还可以将视图绑定到视图模型的属性,例如CheckBox类型的。在属性更改时,显示对话框并使用bool返回结果。

或者让视图模型公开一个标志,例如ICommand和属性HasException(可用于绑定自定义对话框或表单)。然后自己创建一个简单的模式对话框:

示例对话框

ExceptionDialogModel

您可以将<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,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,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绑定将数据发送回去。使用命令触发重试过程(例如 OK Retry 按钮)。
TwoWay可以绑定到Visibility属性。您可以为该对话框设置动画,并给它任何外观和感觉。

本文链接:https://www.f2er.com/3169988.html

大家都在问