Как закрыть ChildWindow с помощью кнопки «Отмена» с помощью MVVM Light Toolkit - PullRequest
7 голосов
/ 12 апреля 2011

Я новичок в MVVM и пытаюсь выяснить, как закрыть ChildWindow с помощью традиционной кнопки Cancel , используя MVVM Light Toolkit .

В моем ChildWindow (StoreDetail.xaml) у меня есть:

<Button x:Name="CancelButton" Content="Cancel" Command="{Binding CancelCommand}" />

В моей ViewModel (ViewModelStoreDetail.cs) у меня есть:

public ICommand CancelCommand { get; private set; }

public ViewModelStoreDetail()
{
    CancelCommand = new RelayCommand(CancelEval);
}

private void CancelEval()
{
    //Not sure if Messenger is the way to go here...
    //Messenger.Default.Send<string>("ClosePostEventChildWindow", "ClosePostEventChildWindow");
}

Ответы [ 8 ]

1 голос
/ 13 июля 2011
private DelegateCommand _cancelCommand;

public ICommand CancelCommand
{
    get
    {
        if (_cancelCommand == null)
            _cancelCommand = new DelegateCommand(CloseWindow);
        return _cancelCommand;
    }
}

private void CloseWindow()
{
    Application.Current.Windows[Application.Current.Windows.Count - 1].Close();
}
1 голос
/ 20 сентября 2012

Если вы отобразили свое дочернее окно, вызвав ShowDialog (), то вы можете просто установить для свойства IsCancel элемента управления кнопки значение «True».

<Button Content="Cancel" IsCancel="True" />

Оно становится таким же, как нажатие кнопки Xв окне или нажав ESC на клавиатуре.

0 голосов
/ 14 августа 2013

Как-то поздно на вечеринку, но я думал, что добавлю свой вклад.Заимствование из ответа пользователя841960:

public RelayCommand CancelCommand
{
    get;
    private set;
}

Затем:

SaveSettings = new RelayCommand(() => CloseWindow());

Затем:

private void CloseWindow()
{
    Application.Current.Windows[Application.Current.Windows.Count - 1].Close();
}

Это немного чище, чем использование ICommand, и работает так же хорошо.

Итак, чтобы подвести итог, пример класса будет выглядеть так:

public class ChildViewModel
{
    public RelayCommand CancelCommand
    {
        get;
        private set;
    }

    public ChildViewModel()
    {
        SaveSettings = new RelayCommand(() => CloseWindow());
    }

    private void CloseWindow()
    {
        Application.Current.Windows[Application.Current.Windows.Count - 1].Close();
    }
}
0 голосов
/ 08 сентября 2012

Вот несколько способов сделать это.

  1. Отправьте сообщение вашему дочернему окну и установите для DialogueResult значение false в коде дочернего окна.
  2. Создайте свойство DialogueResult и привяжите его с помощьюchildwindow Свойство Dialoue CLR, установите его для метода CancelEval класса CancelCommand.
  3. Создайте объект Childwindow и установите для DialogueResult значение false для CancelEval.
0 голосов
/ 13 августа 2011

Мы реализовали функциональность без кода . Посмотрите, поможет ли это.

РЕДАКТИРОВАТЬ: Здесь есть Stackoverflow обсуждение

0 голосов
/ 13 апреля 2011

В MVVM Light Toolkit лучшее, что вы можете сделать, это использовать Messenger для взаимодействия с View.

Просто зарегистрируйте метод close в View (обычно в коде файла), а затем отправьте запрос на закрытие окна, когда вам это нужно.

0 голосов
/ 13 апреля 2011

Прошло много времени с тех пор, как я использовал WPF и MVVMLight, но да, думаю, я бы использовал мессенджер для отправки события отмены.

0 голосов
/ 12 апреля 2011

Посмотрите эту статью на MSDN . Примерно на половине пути есть подход, как это сделать. В основном он использует либо WorkspaceViewModel, либо реализует интерфейс, который выставляет и событие RequestClose

Затем вы внутри DataContext окна (если вы устанавливаете для него ViewModel) вы можете присоединиться к событию.

Это выдержка из статьи (рисунок 7). Вы можете настроить его в соответствии с вашими потребностями.

// In App.xaml.cs
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);

MainWindow window = new MainWindow();

// Create the ViewModel to which 
// the main window binds.
string path = "Data/customers.xml";
var viewModel = new MainWindowViewModel(path);

// When the ViewModel asks to be closed, 
// close the window.
viewModel.RequestClose += delegate 
{ 
    window.Close(); 
};

// Allow all controls in the window to 
// bind to the ViewModel by setting the 
// DataContext, which propagates down 
// the element tree.
window.DataContext = viewModel;

window.Show();
}
...