如何在MMVM WPF的主窗口中打开子窗口 [英] How to open child window in mainwindow in MMVM WPF

查看:54
本文介绍了如何在MMVM WPF的主窗口中打开子窗口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有 3 个屏幕

主窗口.xaml

<Window x:Class="PatientAdminTool.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         >
    <Window.DataContext>
        <vm:MainViewModel></vm:MainViewModel>    
    </Window.DataContext>
    <WindowChrome.WindowChrome>
        <WindowChrome 
        CaptionHeight="0"/>
    </WindowChrome.WindowChrome>
    <ContentControl >
        <v:PatientWindow DataContext="{Binding PatientVM}"/>
    </ContentControl>
</Window>

患者窗口.xaml

<UserControl x:Class="PatientAdminTool.View.PatientWindow"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:vm="clr-namespace:PatientAdminTool.ViewModel"
         xmlns:v="clr-namespace:PatientAdminTool.View"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300" >
    <UserControl.DataContext>
        <vm:PatientSelectorVM/>
    </UserControl.DataContext>
    <Grid >
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

            <DockPanel Grid.Row="0" LastChildFill="True" Height="40" Background="#646161" >
                <StackPanel DockPanel.Dock="Left" Orientation="Horizontal">
                    <TextBlock Margin=" 10,5,0,0" HorizontalAlignment="Center" Text="Patients" FontSize="16"  TextAlignment="Center" VerticalAlignment="Center" Foreground="#FFFFFF"/>
                </StackPanel>
                <StackPanel Margin="10,10,0,0" DockPanel.Dock="Right" Background="Transparent"  Orientation="Vertical" HorizontalAlignment="Right" VerticalAlignment="Top" Width="50" >
                    <StackPanel Background="Transparent"  Orientation="Horizontal" HorizontalAlignment="Right">
                        <Button Focusable="False" ToolTip="Close" VerticalAlignment="Center" Background="#646161" BorderThickness="0" BorderBrush="Transparent" Padding="-4" Command="{Binding CloseCommand,Mode=TwoWay}">
                            <Button.Content>
                                <Grid Width="45" Height="23">
                                    <TextBlock Foreground="White"   Text="r" FontFamily="Marlett" FontSize="20" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                                </Grid>
                            </Button.Content>
                            <Button.Template>
                                <ControlTemplate TargetType="Button">
                                    <ContentPresenter Content="{TemplateBinding Content}"/>
                                </ControlTemplate>
                            </Button.Template>
                        </Button>
                    </StackPanel>
                </StackPanel>
            </DockPanel>
        <ContentControl Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
            <v:PatientSelector DataContext="{Binding PatientSelectorVM}" />
        </ContentControl>
    </Grid>
</UserControl>

结果应如下图

我需要使用相应的视图模型来显示子窗口.我不明白该怎么做?

I need to show the child window by using corresponding view model. I am not getting how to do this?

推荐答案

您无法直接访问 ViewModel 中的 UI 元素(包括窗口).

You can't access UI elements (including windows) in ViewModels directly.

只需对打开窗口"功能进行抽象.最简单的方法是使用界面:

Just make abstraction of the functionality "Open Window". The easiest way is to use interface:

interface IDialogService 
{
    public void OpenWindow(BaseViewModel windowViewModel);
}

//in viewmodel:
void OpenPatientWindow_CommandExecuted()
{
     var patientWindowVM = new PatientWindowViewModel())
     patientWindowVM.Parameter = "This way you can pass parameters";
    _dialogService.OpenWindow(patientWindowVM);
}

点击此处获取更多灵感:使用 MVVM 在 WPF 中处理对话框

go here for more inspiration: Handling Dialogs in WPF with MVVM

这篇关于如何在MMVM WPF的主窗口中打开子窗口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆