WPF MVVM: How to close a window

后端 未结 21 1814
后悔当初
后悔当初 2020-12-04 08:19

I have a Button that closes my window when it\'s clicked:


21条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-04 08:42

    I have following solution in Silverlight. Would also be in WPF.

    ChildWindowExt.cs:

    namespace System.Windows.Controls
    {
        public class ChildWindowExt : ChildWindow
        {
            public static readonly DependencyProperty IsOpenedProperty =
              DependencyProperty.Register(
              "IsOpened",
              typeof(bool),
              typeof(ChildWindowExt),
              new PropertyMetadata(false, IsOpenedChanged));
    
            private static void IsOpenedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                if ((bool)e.NewValue == false)
                {
                    ChildWindowExt window = d as ChildWindowExt;
                    window.Close();
                }
                else if ((bool)e.NewValue == true)
                {
                    ChildWindowExt window = d as ChildWindowExt;
                    window.Show();
                }
            }
    
            public bool IsOpened
            {
                get { return (bool)GetValue(IsOpenedProperty); }
                set { SetValue(IsOpenedProperty, value); }
            }
    
            protected override void OnClosing(ComponentModel.CancelEventArgs e)
            {
                this.IsOpened = false;
                base.OnClosing(e);
            }
    
            protected override void OnOpened()
            {
                this.IsOpened = true;
                base.OnOpened();
            }
        }
    }
    

    ItemWindow.xaml:

    
    
        
            

    ItemViewModel.cs:

    private bool _IsOpened;
    public bool IsOpened
    {
        get
        {
            return _IsOpened;
        }
        set
        {
            if (!Equals(_IsOpened, value))
            {
                _IsOpened = value;
                RaisePropertyChanged("IsOpened");
            }
        }
    }
    
    private RelayCommand _UpdateCommand;
    /// 
    /// Insert / Update data entity
    /// 
    public RelayCommand UpdateCommand
    {
        get
        {
            if (_UpdateCommand == null)
            {
                _UpdateCommand = new RelayCommand(
                    () =>
                    {
                        // Insert / Update data entity
                        ...
    
                        IsOpened = false;
                    },
                    () =>
                    {
                        return true;
                    });
            }
            return _UpdateCommand;
        }
    }
    

    ItemsViewModel.cs:

        private RelayCommand _InsertItemCommand;
        /// 
        /// 
        /// 
        public RelayCommand InsertItemCommand
        {
            get
            {
                if (_InsertItemCommand == null)
                {
                    _InsertItemCommand = new RelayCommand(
                        () =>
                        {
                            ItemWindow itemWin = new ItemWindow();
                            itemWin.DataContext = new ItemViewModel();
                            itemWin.Show();
    
                            // OR
    
                            // ItemWindow itemWin = new ItemWindow();
                            // ItemViewModel newItem = new ItemViewModel();
                            // itemWin.DataContext = newItem;
                            // newItem.IsOpened = true;
    
                        },
                        () =>
                        {
                            return true;
                        });
                }
                return _InsertItemCommand;
            }
        }
    

    MainPage.xaml:

    
        

    I wish you all good ideas and projects ;-)

提交回复
热议问题