Как ViewModel должен закрыть форму?

С моей точки зрения, вопрос c-sharp довольно хороший, поскольку c-sharp тот же подход будет использоваться wpf не только для окна «Вход c# в систему», но и для любого c#.net окна. Я просмотрел много c# предложений, и ни одно из model-view-viewmodel них мне не подходит. Просмотрите c#-language мое предложение, взятое из c#-language MVVM design pattern article.

Каждый класс ViewModel должен c# наследовать от WorkspaceViewModel, у которого mvvm есть событие RequestClose и свойство c#.net CloseCommand типа ICommand. Реализация по умолчанию mvvm свойства CloseCommand вызовет событие visual-c# RequestClose.

Чтобы закрыть окно, необходимо c#-language переопределить метод OnLoaded вашего model-view-viewmodel окна:

void CustomerWindow_Loaded(object sender, RoutedEventArgs e)
{
    CustomerViewModel customer = CustomerViewModel.GetYourCustomer();
    DataContext = customer;
    customer.RequestClose += () => { Close(); };
}

или OnStartup вашего приложения:

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        MainWindow window = new MainWindow();
        var viewModel = new MainWindowViewModel();
        viewModel.RequestClose += window.Close;
        window.DataContext = viewModel;

        window.Show();
    }

Я c#-language полагаю, что событие RequestClose и реализация visual-c# свойства CloseCommand в WorkspaceViewModel довольно ясны, но .cs-file я покажу, что они согласованы:

public abstract class WorkspaceViewModel : ViewModelBase
// There's nothing interesting in ViewModelBase as it only implements the INotifyPropertyChanged interface
{
    RelayCommand _closeCommand;
    public ICommand CloseCommand
    {
        get
        {
            if (_closeCommand == null)
            {
                _closeCommand = new RelayCommand(
                   param => Close(),
                   param => CanClose()
                   );
            }
            return _closeCommand;
        }
    }

    public event Action RequestClose;

    public virtual void Close()
    {
        if ( RequestClose != null )
        {
            RequestClose();
        }
    }

    public virtual bool CanClose()
    {
        return true;
    }
}

И c#.net исходный код RelayCommand:

public class RelayCommand : ICommand
{
    #region Constructors

    public RelayCommand(Action execute, Predicate canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");

        _execute = execute;
        _canExecute = canExecute;
    }
    #endregion // Constructors

    #region ICommand Members

    [DebuggerStepThrough]
    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute(parameter);
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public void Execute(object parameter)
    {
        _execute(parameter);
    }

    #endregion // ICommand Members

    #region Fields

    readonly Action _execute;
    readonly Predicate _canExecute;

    #endregion // Fields
}

P.S. Не относитесь mvvm ко мне плохо из-за этих источников! Если c-sharp бы они были у меня вчера, это c-sharp сэкономило бы мне несколько visual-c# часов ...

P.P.S. Любые комментарии .cs-file и предложения приветствуются.

c#

wpf

mvvm

2022-11-20T08:31:49+00:00