2017-01-13 3 views
1

У меня есть 3 экраныКак открыть дочернее окно в главном окне в MMVM WPF

MainWindow.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> 

PatientWindow.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> 

enter image description here Результат должен быть, как на изображении ниже

Мне нужно показать дочернее окно с помощью соответствующей модели представления. Я не понимаю, как это сделать?

ответ

0

Bind Контент свойство ContentPresenter к PatientVM свойства MainViewModel в MainWindow.xaml и использовать определение DataTemplate за просмотр детской/вид типа модели:

<ContentControl Content="{Binding PatientVM}"> 
    <ContentControl.Resources> 
     <DataTemplate DataType="local:PatientSelectorVM"> 
      <v:PatientWindow /> 
     </DataTemplate> 
     <DataTemplate DataType="local:ThirdScreenType"> 
      <v:ThirdScreenView /> 
     </DataTemplate> 
    </ContentControl.Resources> 
</ContentControl> 

Вы затем установите PatientVM свойство MainViewModel на объект PatientSelectorVM, чтобы отобразить представление PatientWindow и объект ThirdScreenType (или что-то еще, что ваш класс фактически вызывается), чтобы отобразить другое представление в ContentControl.

Убедитесь, что MainViewModel реализует интерфейс INotifyPropertyChanged и поднять PropertyChanged события в инкубаторе в PatientVM собственности:

public BaseViewModel PatientVM 
{ 
    get { return _patientVM; } 
    set 
    { 
     patientVM = value; 
     OnPropertyChanged(); 
    } 
} 

Для вас, чтобы иметь возможность установить свойство как объект PatientSelectorVM и другому тип объектов, эти классы должны выводиться из одного базового класса или реализовывать один и тот же интерфейс.

1

Вы не можете напрямую обращаться к элементам пользовательского интерфейса (включая окна) в режимах ViewModels.

Просто сделайте абстракцию функциональности «Открыть окно». Самый простой способ состоит в использовании интерфейса:

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); 
} 

идти здесь для больше вдохновения: Handling Dialogs in WPF with MVVM

Смежные вопросы