0
Answer

How to close PopUp window in wpf using mvvm?

Manoharan

Manoharan

10y
3.4k
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