原文: 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那麼就能夠關閉視窗了;
當然實作的方式有很多種,用附加屬性也是能夠實作的;這裡使用行為的話是為了指定類型進而避免附加屬性的類型判斷