我有一个使用MVVM设计的C#应用程序。结构是传统的。
我有一个视图模型,我想在其中启动一个自定义的非模态对话框。
此对话框负责收集数据绑定的序列号。
以下是我想象的非模态对话框:
这是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()
..
此对话框不会更新父视图。此对话框只获取要传递给另一个方法的值。
我该如何实现?我见过其他人的方法,但它们对我的实现没有意义。它们不显示/解释视图和视图模型的连接方式。他们经常把东西丢弃或者没有家的代码块,例如这段代码应该进入这个类......
非常感谢能够让我走上正轨的人!
答案 0 :(得分:1)
这是一种做法的方法。 使用MVVM模式时显示对话框 http://www.codeproject.com/Articles/36745/Showing-Dialogs-When-Using-the-MVVM-Pattern
重要的是要保持ViewModel
与视图相关的内容。使用IDialogService
抽象视图内容,可以注入ViewModel
并轻松模拟测试。
DialogService也是与MVVM结合的一个很好的关键词,有很多例子。 这使您可以完全控制对话框的行为。
HTH