web-dev-qa-db-de.com

fenster zum Schließen des Fensters in wpf MVVM

gibt es eine Möglichkeit, die Schaltfläche zum Schließen des Fensters, z. B. "X" in der oberen rechten Ecke des Ansichtsmodells, durch Bindung an einen Befehl zu behandeln? oder überschreiben Sie den Befehl window.close, sodass beim Schließen eines Fensters zum vorherigen Fenster zurückgekehrt wird. Danke.

18
Andris Mudiayi

Dafür gibt es mehrere Methoden. Ich habe unten auf zwei Methoden hingewiesen.

  1. Sie können angehängte Befehle verwenden, um die Schließen-Schaltfläche in Ihrem Ansichtsmodell zu binden.

  2. Sie können den folgenden Code verwenden

Xaml:

<Window x:Class="WpfInfragisticsModal.MainWindow"
        xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" 
        xmlns:ig="http://schemas.infragistics.com/xaml"
        xmlns:i="http://schemas.Microsoft.com/expression/2010/interactivity"
        Name="myWindow">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Closing">
            <i:InvokeCommandAction Command="{Binding CloseWindowCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <Grid>
    </Grid>
</Window>

HINWEIS: Fügen Sie den Verweis "System.Windows.Interactivity" hinzu

Modell anzeigen

private ICommand closeWindowCommand;

public ICommand CloseWindowCommand
{
      get
      {
          if (closeWindowCommand == null)
          {
             closeWindowCommand = new RelayCommand(param => this.CloseWindow(), null);
          }
          return closeWindowCommand;
      }
 }

private void CloseWindow()
{
     //Do your operations
}

Dies ist meine RelayCommand-Klasse.

public class RelayCommand : ICommand
{
    /// <summary>
    /// Initializes a new instance of the <see cref="RelayCommand"/> class.
    /// </summary>
    /// <param name="execute">The execute.</param>
    public RelayCommand(Action<object> execute)
        : this(execute, null)
    {
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="RelayCommand"/> class.
    /// </summary>
    /// <param name="execute">The execute.</param>
    /// <param name="canExecute">The can execute.</param>
    public RelayCommand(Action<object> execute, Predicate<object> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");
        _execute = execute;
        _canExecute = canExecute;
    }

    /// <summary>
    /// Defines the method that determines whether the command can execute in its current state.
    /// </summary>
    /// <param name="parameter">Data used by the command.  If the command does not require data to be passed, this object can be set to null.</param>
    /// <returns>
    /// true if this command can be executed; otherwise, false.
    /// </returns>
    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute(parameter);
    }

    /// <summary>
    /// Occurs when changes occur that affect whether or not the command should execute.
    /// </summary>
    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    /// <summary>
    /// Defines the method to be called when the command is invoked.
    /// </summary>
    /// <param name="parameter">Data used by the command.  If the command does not require data to be passed, this object can be set to null.</param>
    public void Execute(object parameter)
    {
        _execute(parameter);
    }

    /// <summary>
    /// Action
    /// </summary>
    private readonly Action<object> _execute;


    /// <summary>
    /// Predicate
    /// </summary>
    private readonly Predicate<object> _canExecute;
}
31
Haritha

das Problem war, dass ich ein übergeordnetes Fenster geschlossen habe und es wieder öffnete, nachdem ich das entsprechende untergeordnete Fenster geschlossen hatte, wodurch Speicherverluste verursacht wurden. Ich habe das übergeordnete Fenster ausgeblendet und nach Schließen des untergeordneten Fensters wieder angezeigt. Ich bin neu in WFP und Windows-Entwicklung, so lerne ich, wie ich gehe.

1
Andris Mudiayi