如何使用MVVM Light Toolkit通过“取消”按钮关闭ChildWindow

|| 我是MVVM的新手,它试图弄清楚如何使用MVVM Light Toolkit通过传统的“取消”按钮关闭ChildWindow。 在我的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\");
}
    
已邀请:
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();
}
    
如果通过调用ShowDialog()显示子窗口,则只需将按钮控件的IsCancel属性设置为\“ True \”。
<Button Content=\"Cancel\" IsCancel=\"True\" />
它与单击窗口上的X按钮或按键盘上的ESC相同。     
看一下MSDN上的这篇文章。在大约一半的位置,有一种方法可以做到这一点。基本上,它要么使用
WorkspaceViewModel
,要么实现暴露和事件
RequestClose
的接口 然后,您可以在Window的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();
}
    
自从我使用WPF和MVVMLight以来已经有一段时间了,但是是的,我想我会使用Messenger来发送cancel事件。     
在MVVM Light Toolkit中,最好的办法是使用ѭ7与ѭ8进行交互。 只需在
View
中注册关闭方法(通常在文件后面的代码中),然后在需要时发送关闭窗口的请求。     
我们已经实现了NO-CODE BEHIND功能。看看是否有帮助。 编辑:这里有Stackoverflow讨论     
这是一些完成它的方法。 将消息发送到您的子窗口,并在后面的子窗口中将DialogueResult设置为false。 创建DialogueResult属性并将其与子窗口Dialoue CLR属性绑定,在CancelCommand的CancelEval方法上进行设置。 创建Childwindow的对象,并在CancelEval上将DialogueResult设置为false。     
晚会有点晚,但我想我要补充一下意见。从user841960的答案中借来的:
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();
    }
}
    

要回复问题请先登录注册