0
Answer

How to close the popup window using mvvm in wpf?

Manoharan

Manoharan

10y
829
1
Hi,

  I created to 2 usercontrol for parent,child and one mainwindow. I refer the child window inside the popup control of parent window.In parent window i try to click the button popup window display.
Now i want close the popup window,when i try the click the childwindow submit button.Please help me.

MainWindow.xaml:

<Window x:Class="parentchild.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:my="clr-namespace:WpfLab.Controls;assembly=WpfLab.Controls"
  xmlns:local="clr-namespace:parentchild.View"
  Title="MainWindow" Height="768" Width="1280">
  <Grid> 
  <local:ParentView></local:ParentView> 
  </Grid>
</Window>


ParentView.xaml:

<UserControl x:Class="parentchild.View.ParentView"
  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:controls="clr-namespace:parentchild.View"
  xmlns:vm="clr-namespace:parentchild.ViewModel"
  mc:Ignorable="d"
  d:DesignHeight="768" d:DesignWidth="1280">
 
 
  <Grid x:Name="LayoutRoot" Width="1280" Height="768" Background="#2f3033">

  <Grid.Resources>
  <BooleanToVisibilityConverter x:Key="BoolToVis" />
  </Grid.Resources>


  <Canvas Margin="0.08,0.33,-0.081,0" VerticalAlignment="Top" Width="1280" Height="59" Visibility="{Binding canvasPlayerMain}" >
 
  <Button Width="144" Height="44" Content="Submit" Canvas.Left="14" Canvas.Top="8" BorderBrush="#FF496E00" Foreground="Black" Command="{Binding submitCommand}">
 
  </Button>
 
 
  <StackPanel>
  <Popup x:Name="popup" Width="100" Height="100" AllowsTransparency="True" IsOpen="{Binding IsPopupIsOpen}" Visibility="{Binding popupVisibility}">
  <Grid Background="Transparent">
  <controls:ChildView></controls:ChildView>
  </Grid>
  </Popup>
  </StackPanel>
  </Canvas>
  </Grid>
</UserControl>

ParentView.xaml.cs:


  public partial class ParentView : UserControl
  {
  public RumView()
  {
  InitializeComponent();
 
  this.DataContext = new ParentViewModel();
  }
  }
}


ParentViewModel.cs:
 public class ParentViewModel : INotifyPropertyChanged
  {
  private readonly IEventAggregator eventAggregator=new EventAggregator();

  private ParentModel currenparentModel;

  private string resultMessage;

  private bool _popupIsOpen;

  public RumViewModel()
  {
  currenrumModel = new RumModel();

  this.submitCommand = new DelegateCommand<object>(this.Execute, this.CanExecute);
 
 
  }
  public bool IsPopupIsOpen
  {
  get { return _popupIsOpen; }
  set
  {
  _popupIsOpen = value;
  NotifyPropertyChanged("IsPopupIsOpen");
  }
  }
  public ParentModel currentparent
  {
  get
  {
  return currenparentModel
  }
  set
  {
  currenparentModel= value;
  }
  }
 
  public Visibility popupVisibility
  {
  get { return this.currenrumModel.popupVisibility; }
  set
  {
  this.currenrumModel.popupVisibility = value;
  this.NotifyPropertyChanged("popupVisibility");
  }
  }
  #region commands
  public ICommand submitCommand { get; private set; }
 
  #endregion

  private bool CanExecute(object arg)
  {
  return true;
 
  }

  private void Execute(object arg)
  {
  popupVisibility = Visibility.Visible;
  IsPopupIsOpen = true;
  } 
 
  private void RaiseCanExecuteChanged()
  {
  DelegateCommand<object> tosscommand = tosscardCommand as DelegateCommand<object>;
 
  cancelcommand.RaiseCanExecuteChanged();
  }
  #region INotifyPropertyChanged Members

  public event PropertyChangedEventHandler PropertyChanged;

  private void NotifyPropertyChanged(string propertyName)
  {
  if (this.PropertyChanged != null)
  {
  this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  }
  }

  #endregion
}


ChildWindowView.xaml:
<UserControl x:Class="parentchild.View.ChildWindowView"
  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:viewModels="clr-namespace:parentchild.ViewModel"
  xmlns:views="clr-namespace:parentchild.View"
  mc:Ignorable="d"
  d:DesignHeight="500" d:DesignWidth="500">
 
  <Grid>
  <TextBlock HorizontalAlignment="Left" Margin="165,106,0,0" TextWrapping="Wrap" Text="Reschedule Timer" VerticalAlignment="Top" FontSize="21.333" Foreground="White" Width="174" Height="28"/>
  <TextBlock HorizontalAlignment="Left" Margin="37,199,0,0" TextWrapping="Wrap" Text="Set The Timer" VerticalAlignment="Top" FontSize="21.333" Foreground="White" Width="174" Height="28"/>
  <TextBox HorizontalAlignment="Left" Margin="252,199,0,0" TextWrapping="Wrap" Text="{Binding Path=setTimer}" VerticalAlignment="Top" Width="206" Height="38" />
  <Button Content="Submit" HorizontalAlignment="Left" Margin="252,278,0,0" VerticalAlignment="Top" Foreground="White" Width="122" Height="39" Background="Green" Command="{Binding SubmitCommand}"/>

  </Grid>
</UserControl>

ChildWindowView.xaml.cs:
 public partial class ChildWindowView : UserControl
  {
  public ChildWindowView()
  {
  InitializeComponent();
  this.DataContext = new ChildWindowViewModel();
  }
  }
ChildWindowViewModel.cs:
 public class ChildWindowViewModel : INotifyPropertyChanged
  {
  private ChildWindowModel currentChildWindow;
  private readonly IEventAggregator eventAggregator = new EventAggregator();

  public ChildWindowViewModel()
  {
  currentChildWindow = new ChildWindowModel();

  this.SubmitCommand = new DelegateCommand<object>(this.OnSubmit, this.CanSubmit);
  }

  private void RaiseCanExecuteChanged()
  {
  DelegateCommand<object> command = SubmitCommand as DelegateCommand<object>;
  command.RaiseCanExecuteChanged();
  }

  public ChildWindowModel currentTimer
  {
  get
  {
  return currentTimer;
  }
  set
  {
  currentTimer = value;
  }
  }

  public string setTimer
  {
  get { return this.currentChildWindow.setTimer; }
  set
  {
  if (this.currentChildWindow.setTimer != value)
  {
  this.currentChildWindow.setTimer = value; 
  NotifyPropertyChanged("setTimer");
  RaiseCanExecuteChanged();
  }
  }
  }
  public string errMessage
  {
  get { return this.currentChildWindow.errMessage; }
  set
  {
  if (this.currentChildWindow.errMessage != value)
  {
  this.currentChildWindow.errMessage = value;
  NotifyPropertyChanged("errMessage");
  RaiseCanExecuteChanged();
  }
  }
  }
  public ICommand SubmitCommand { get; private set; }


  private bool CanSubmit(object arg)
  {
  return true;
  }


  private void OnSubmit(object arg)
  {

  try
  {

  if (string.IsNullOrEmpty(setTimer))
  {
  this.errMessage = "Please enter Rescheduler Timer value";
  }
 

  }
  catch (Exception ex)
  {
  throw ex;
  }
  }
 

  #region INotifyPropertyChanged Members

  public event PropertyChangedEventHandler PropertyChanged;

  private void NotifyPropertyChanged(string propertyName)
  {
  if (this.PropertyChanged != null)
  {
  this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  }
  }

  #endregion