天天看點

MVVM模式下關閉視窗的實作

原文: MVVM模式下關閉視窗的實作

通過行為來實作

實作界面與邏輯的分離

視窗關閉行為:其中含有布爾型的Close屬性,将相應的關閉行為綁定到該屬性上,則可以實作視窗的關閉行為,進而實作VM與View的分離

public class WindowCloseBehaviour : Behavior<Window>
    {
        public static readonly DependencyProperty CloseProperty =
          DependencyProperty.Register(
          "Close",
          typeof(bool),
          typeof(WindowCloseBehaviour),
          new FrameworkPropertyMetadata(
                    false,
                    OnCloseChanged));

        public bool Close
        {
            get { return (bool)GetValue(CloseProperty); }
            set { SetValue(CloseProperty, value); }
        }

        private static void OnCloseChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var window = ((WindowCloseBehaviour)d).AssociatedObject;
            var newValue = ((bool)e.NewValue);
            if (newValue)
            {
                window.Close();
            }
        }      

View:

xmlns:event="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

而behaviors則是聲明的WindowCloseBehaviour的命名空間

<event:Interaction.Behaviors>
        <behaviors:WindowCloseBehaviour Close="{Binding IsWinClose}"/>
    </event:Interaction.Behaviors>      

ViewModel:

private bool _isWinClose;
        /// <summary>
        /// 訓示視窗是否關閉
        /// </summary>
        public bool IsWinClose
        {
            get { return _isWinClose; }
            set
            {
                _isWinClose = value;
                OnPropertyChanged("IsWinClose");

                //視窗關閉則重置視窗狀态
                if (IsWinClose)
                {
                    ResetWindowCloseState();
                }
            }
        }

        //重置視窗狀态
        private void ResetWindowCloseState()
        {
            IsWinClose = false;
        }
          

在業務邏輯中隻需要指定isWinClose = true那麼就能夠關閉視窗了;

當然實作的方式有很多種,用附加屬性也是能夠實作的;這裡使用行為的話是為了指定類型進而避免附加屬性的類型判斷

上一篇: PathAnimation
下一篇: WPF 路由事件