我是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");
}
答案 0 :(得分:1)
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 :(得分:1)
如果通过调用ShowDialog()显示子窗口,则只需将按钮控件的IsCancel属性设置为“True”。
<Button Content="Cancel" IsCancel="True" />
与单击窗口上的X按钮或按键盘上的ESC键相同。
答案 2 :(得分:0)
看看this articleon 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();
}
答案 3 :(得分:0)
自从我使用WPF和MVVMLight以来已经有一段时间但是我想我会使用消息来发送取消事件。
答案 4 :(得分:0)
在 MVVM Light Toolkit 中,您可以做的最好的事情是使用Messenger
与View
进行互动。
只需在View
中注册close方法(通常在代码隐藏文件中),然后在需要时发送关闭窗口的请求。
答案 5 :(得分:0)
我们已经实施了NO-CODE BEHIND functionality。看看它是否有帮助。
编辑:这里有Stackoverflow讨论
答案 6 :(得分:0)
以下是实现目标的一些方法。
答案 7 :(得分:0)
有点迟到了,但我想我会加入我的意见。借用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();
}
}