0

我有一个带有 MVVM 模式的 WPF 应用程序,它包含以下 2 个视图:

1:(MainWindow.xaml它是一个窗口)下面是主要部分MainWindow.xaml

<Window.Resources>
    <DataTemplate DataType="{x:Type vm:XliffListViewModel}">
        <vw:XliffListView />
    </DataTemplate>
</Window.Resources>
<Grid Margin="4">
    <Border Background="GhostWhite" BorderBrush="LightGray" BorderThickness="1" CornerRadius="5" >
        <ItemsControl ItemsSource="{Binding ViewModels}" Margin="4" />
    </Border>
</Grid>

2:(XliffListView.xaml它是一个用户控件)XliffListView 包含一个数据网格和一个按钮,用于保存发生的所有更改

如果未保存更改,我想在用户关闭应用程序时显示消息框

4

1 回答 1

0

您可以编写并Attached behavior处理Window.Closing()Window 的事件并执行ClosingCommandfromViewModel并返回 true 或 false 作为参数,以便e.Cancel在 VM 想要停止关闭窗口时取消 () 关闭事件。

下面的代码只是概念,并不完整

XAML

  <Window x:Class="..."
          ...
          myBheaviors:WindowBehaviors.ClosingCommand="{Binding MyClosingCommand}">
      ...
  </Window>      

视图模型

  public class MyWindowViewModel 
  {
      public ICommand MyClosingCommand
      {
          get
             { 
                 if (_myClosingCommand == null)
                    _myClosingCommand 
                       = new DelegateCommand<CancelEventArgs>(OnClosing);
                 return _myClosingCommand;
             }
      }

      private void OnClosing(CancelEventArgs e)
      {
          if (this.Dirty) //Some function that decides if the VM has pending changes.
              e.Cancel = true;
      }
  }

依附行为

  public static class WindowBehaviors
  {
      public static readonly DependencyProperty ClosingCommandProperty
         = DependencyProperty.RegistsrrAttached(
                "ClosingCommand", 
                ..., 
                new PropertyMetataData(OnClosingCommandChanged);

      public static ICommand GetClosingCommand(...) { .. };

      public static void SetClosingCommand(...) { .. };

      private static void OnClosingCommandChanged(sender, e)
      {
           var window = sender as Window;
           var command = e.NewValue as ICommand;
           if (window != null && command != null)
           {
               window.Closing 
                  += (o, args) => 
                     { 
                         command.Execute(args);
                         if (args.Cancel)
                         {
                             MessageBox.Show(
                                "Window has pending changes. Cannot close");

                             // Now window will be stopped from closing.
                         }
                     };     
           } 
      }
  }

编辑:

对于用户控件,而不是Closing使用Unloaded事件。

另外尝试建立ViewModelsiee Window的ViewModel之间的层次结构应该包含UserControl的ViewModel。因此,该Closing事件的 IsDirty() 调用也可以检查 UserControls 的 ViewModel。

于 2013-01-28T09:02:40.010 回答