如何在MVVM中启动非模态对话框?

时间:2016-02-09 16:37:40

标签: c# wpf mvvm

我有一个使用MVVM设计的C#应用​​程序。结构是传统的。

我有一个视图模型,我想在其中启动一个自定义的非模态对话框。

此对话框负责收集数据绑定的序列号。

以下是我想象的非模态对话框:

enter image description here

这是Xaml代码:

<Window x:Class="RailComm.EmbeddedApplications.EacManagementTool.Views.RestoreDeviceDialogView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:RailComm.EmbeddedApplications.EacManagementTool.Views"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        Title="Device Restore" Height="150" Width="375">
        <Window.Resources>
            <Style TargetType="{x:Type TextBox}" x:Key="SelectableLabel">
                <Setter Property="BorderThickness" Value="0" />
                <Setter Property="Background" Value="Transparent" />
                <Setter Property="IsReadOnly" Value="True" />
                <Setter Property="HorizontalAlignment" Value="Center" />
            </Style>
        </Window.Resources>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="35"/>
            </Grid.RowDefinitions>
            <StackPanel Grid.Row="0">
                <Label HorizontalAlignment="Left" Grid.Row="1">This device has no identity, would you like to restore it?</Label>
            </StackPanel>
            <StackPanel Grid.Row="1">
                <UniformGrid Rows="1" Columns="2" >
                    <Label HorizontalAlignment="Right">Device IP:</Label>
                    <TextBox Text="{Binding IpAddress, Mode=OneWay}" Style="{StaticResource SelectableLabel}"></TextBox>
                </UniformGrid>
            </StackPanel>
            <StackPanel Grid.Row="2">
                <UniformGrid Rows="1" Columns="2" >
                    <Label HorizontalAlignment="Right">Serial Number:</Label>
                    <TextBox Text="{Binding SerialNumber, Mode=TwoWay}"></TextBox>
                </UniformGrid>
            </StackPanel>
            <DockPanel Grid.Row="3">
                <StackPanel Orientation="Horizontal" FlowDirection="RightToLeft" Margin="5">
                    <Button Content="No" Command="{Binding CancelCommand }" Width="45"/>
                    <Separator Width="5"/>
                    <Button Content="Identify" Command="{Binding IdentifyCommand }"/>
                    <Separator/>
                </StackPanel>
            </DockPanel>
        </Grid>
    </Window>

现在我想把它挂钩到我现有的视图模型中,它还包含其他视图模型作为属性。

视图模型我也想添加它,有一个名为GetUpdate()的方法。在方法的某个点上,我想向用户显示非模态对话框。如果序列号通过检查我将除了结果并关闭对话框。如果序列号失败,我想在同一个对话框中显示错误。

我计划拥有这些文件:

ExistingViewModel.cs
DialogViewModel.cs
DialogView.xaml

我只是不知道如何将它们连接起来。异步显示这个模型对我来说非常重要。我可能会在Task.Rush() ..

中运行该对话框

此对话框不会更新父视图。此对话框只获取要传递给另一个方法的值。

我该如何实现?我见过其他人的方法,但它们对我的实现没有意义。它们不显示/解释视图和视图模型的连接方式。他们经常把东西丢弃或者没有家的代码块,例如这段代码应该进入这个类......

非常感谢能够让我走上正轨的人!

1 个答案:

答案 0 :(得分:1)

这是一种做法的方法。 使用MVVM模式时显示对话框 http://www.codeproject.com/Articles/36745/Showing-Dialogs-When-Using-the-MVVM-Pattern

重要的是要保持ViewModel与视图相关的内容。使用IDialogService抽象视图内容,可以注入ViewModel并轻松模拟测试。

DialogService也是与MVVM结合的一个很好的关键词,有很多例子。 这使您可以完全控制对话框的行为。

HTH