如何使用MVVM Light Toolkit关闭带有取消按钮的ChildWindow

时间:2011-04-12 15:56:03

标签: silverlight mvvm mvvm-light childwindow icommand

我是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");
}

8 个答案:

答案 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 中,您可以做的最好的事情是使用MessengerView进行互动。

只需在View中注册close方法(通常在代码隐藏文件中),然后在需要时发送关闭窗口的请求。

答案 5 :(得分:0)

我们已经实施了NO-CODE BEHIND functionality。看看它是否有帮助。

编辑:这里有Stackoverflow讨论

答案 6 :(得分:0)

以下是实现目标的一些方法。

  1. 向您的子窗口发送消息,并在子窗口代码隐藏后将DialogueResult设置为false。
  2. 制作DialogueResult的属性并将其与childwindow Dialoue CLR属性绑定,将其设置为CancelCommand的CancelEval方法。
  3. 创建Childwindow的对象,并在CancelEval上设置DialogueResult false。

答案 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();
    }
}