使用MVVM Light toolkit显示对话框

使用MVVM Light toolkit显示对话框,mvvm,dialog,mvvm-light,Mvvm,Dialog,Mvvm Light,我有一个ViewModel,需要在单击按钮时显示模式窗口(使用ShowDialog())。ViewModel捕获了click命令,但我不想在我的ViewModel中执行window.ShowDialog()。我知道MVVM灯中有一个对话框message,但它用于显示消息框,而不是WPF模式窗口 你有什么想法吗?你应该使用Messenger类。在视图上注册要显示的消息窗口,然后在需要显示消息时调用Messenger类的发送方法 您可以这样做: //在视图的代码隐藏文件中执行此操作 Messenge

我有一个ViewModel,需要在单击按钮时显示模式窗口(使用
ShowDialog()
)。ViewModel捕获了click命令,但我不想在我的ViewModel中执行
window.ShowDialog()
。我知道MVVM灯中有一个
对话框message
,但它用于显示消息框,而不是WPF模式窗口


你有什么想法吗?

你应该使用
Messenger
类。在
视图上
注册要显示的消息窗口,然后在需要显示消息时调用
Messenger
类的
发送
方法

您可以这样做:

//在视图的代码隐藏文件中执行此操作
Messenger.Default.Register(此,显示窗口);
私有void显示窗口(字符串消息)
{
//你的逻辑在这里
}
//在ViewModel中
senger.Default.Send(“一些文本”);

这是我在MVVM Light Toolkit中用于自定义对话框的内容

首先,在应用程序中的某个地方定义这四个类。MessageBase类是工具箱的一部分

public类ShowChildWindowMessage:MessageBase{}
公共类HideChildWindowMessage:MessageBase{}
公共类DisplaySomeContentMessage:MessageBase{}
公共类DisplaySomeOtherContentMessage:MessageBase{}
其次,您需要一个“子”窗口控件。创建包含以下内容的XAML文件:


然后将以下内容添加到此XAML文件的代码隐藏中:

公共部分类子窗口视图:窗口
{
公共子窗口视图(窗口所有者)
{
初始化组件();
所有者=所有者;
关闭+=(s,e)=>
{
//窗户被重新利用,所以就躲起来吧
e、 取消=真;
Send(新的HideChildWindowMessage());
};
}
}
第三,将以下内容添加到MainWindow.xaml文件的代码隐藏中:

公共部分类MainWindowView:窗口
{
private ChildWindowView m_ChildWindowView;
公共主窗口视图()
{
初始化组件();
关闭+=(s,e)=>ViewModelLocator.CleanUp();
加载+=(s,e)=>
{
m_childWindowView=新的childWindowView(此);
};
Messenger.Default.Register(this,(msg)=>m_childWindowView.ShowDialog());
Register(this,(msg)=>m_childWindowView.Hide());
}
}
第四,定义以下视图模型:

公共类ChildWindowVM:ViewModelBase
{
私有ViewModelBase m_currentContent;
公共ViewModelBase当前内容
{
获取{返回m_currentContent;}
设置
{
m_currentContent=值;
RaisePropertyChanged(“当前内容”);
如果(m_currentContent!=null)
{
Messenger.Default.Send(新建ShowChildWindowMessage());
}
}
}
公共子窗口VM()
{
Register(this,(msg)=>CurrentContent=ViewModelLocator.SomeContentVm);
Register(this,(msg)=>CurrentContent=ViewModelLocator.SomeOtherContentVm);
}
}
第五,为要在自定义对话框中显示的内容创建XAML文件和视图模型。在本例中,我的内容视图模型被命名为SomeContent和SomeOtherContent。当然,你可以用任何你想要的东西来代替它们

最后,为了实现这一点,您必须通过向应用程序资源添加以下内容,将内容视图模型绑定到各自的XAML文件:


一旦您完成了所有这些设置,就可以直接添加可以显示在子窗口中的新内容(XAML和视图模型)。要显示内容,只需使用Messenger类调用相应的消息:

Messenger.Default.Send(新的DisplaySomeContentMessage());

如果我需要为您澄清其中的任何部分,请告诉我。

对于所有想要一个非常简单的解决方案并且对非100%清洁MVVM满意的人:
我想从主窗口打开一个连接对话框,并执行了以下操作

首先,我给我的主窗口起了个名字:

<Window x:Name="MainWindow">

然后,我在MainWindowViewModel中创建了一个命令:

public ICommand AddInterfaceCommand
{
    get
    {
        return new RelayCommand<Window>((parentWindow) =>
        {
            var wizard = new ConnectionWizard();
            wizard.Owner = parentWindow;
            wizard.ShowDialog();
        }
    }
}
public ICommand addinterface命令
{
得到
{
返回新的RelayCommand((父窗口)=>
{
var wizard=新建连接向导();
wizard.Owner=parentWindow;
wizard.ShowDialog();
}
}
}
我将主窗口上的按钮绑定到命令,并传递窗口本身(对话框的父窗口):

添加接口
就这些


唯一需要注意的是:从对话框的Viewmodel中获取返回值可能很困难。我不需要该功能。

您可以按如下方式定义接口及其实现。当然,对于依赖项注入容器,您必须这样做

NInjectKernel.Bind<IMessageBoxService>().To<MessageBoxService>();
    private IMessageBoxService _MBService;
    public DropboxSettingsViewModel(IDropboxService dbService, IMessageBoxService mbService)
    {
        if (dbService == null)
            throw new ArgumentNullException("IDropboxService is null");

        _DropboxService = dbService;

        if (mbService == null)
            throw new ArgumentNullException("MessageBoxService is null");

        _MBService = mbService;

    }
单击命令执行方法如下所示

    private void ConfigureDropboxExecute(object obj)
    {

        _MBService.Show("Error Occured Authenticating dropbox", "Dropbox Authentication", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);

    }


public interface  IMessageBoxService
{
    MessageBoxResult Show(string messageBoxText);
    MessageBoxResult Show(string messageBoxText, string caption);
    MessageBoxResult Show(Window owner, string messageBoxText);
    MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button);
    MessageBoxResult Show(Window owner, string messageBoxText, string caption);
    MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon);
    MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button);
    MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult);
    MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon);
    MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, MessageBoxOptions options);
    MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult);
    MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, MessageBoxOptions options);
}
使用System.Windows

public class MessageBoxService : IMessageBoxService
{
    public MessageBoxResult Show(string messageBoxText)
    {
        return MessageBox.Show(messageBoxText);
    }

    public MessageBoxResult Show(Window owner, string messageBoxText)
    {
        return MessageBox.Show(owner, messageBoxText);
    }

    public MessageBoxResult Show(string messageBoxText, string caption)
    {
        return MessageBox.Show(messageBoxText, caption);
    }

    public MessageBoxResult Show(Window owner, string messageBoxText, string caption)
    {
        return MessageBox.Show(owner, messageBoxText, caption);
    }

    public MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button)
    {
        return MessageBox.Show(messageBoxText, caption, button);
    }

    public MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button)
    {
        return MessageBox.Show(owner, messageBoxText, caption, button);
    }

    public MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon)
    {
        return MessageBox.Show(messageBoxText, caption, button, icon);
    }

    public MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon)
    {
        return MessageBox.Show(owner, messageBoxText, caption, button, icon);
    }

    public MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult)
    {
        return MessageBox.Show(messageBoxText, caption, button, icon, defaultResult);
    }

    public MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult)
    {
        return MessageBox.Show(owner, messageBoxText, caption, button, icon, defaultResult);
    }

    public MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, MessageBoxOptions options)
    {
        return MessageBox.Show(messageBoxText, caption, button, icon, defaultResult, options);
    }

    public MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, MessageBoxOptions options)
    {
        return MessageBox.Show(owner, messageBoxText, caption, button, icon, defaultResult, options);
    }
}

但是如何用这种方法返回对话结果呢?即“对话结果”在ChildWindowVM中CurrentContent属性引用的视图模型中处理。例如,SomeContentView.xaml将按钮绑定到SomeContentVM类中的某个RelayCommand。单击按钮时,相关命令将执行分配给它的方法。换句话说,它与一个MessageBox,因为这是ChildWindow视图和视图模型不关心显示内容的行为。它只是CurrentContent属性引用的真实视图和视图模型的窗口包装。有趣!我决定在MainWindow.xaml(字典)中有一个子窗口列表.在上述方法中,ViewModels创建两次,因此另一种方法
public class MessageBoxService : IMessageBoxService
{
    public MessageBoxResult Show(string messageBoxText)
    {
        return MessageBox.Show(messageBoxText);
    }

    public MessageBoxResult Show(Window owner, string messageBoxText)
    {
        return MessageBox.Show(owner, messageBoxText);
    }

    public MessageBoxResult Show(string messageBoxText, string caption)
    {
        return MessageBox.Show(messageBoxText, caption);
    }

    public MessageBoxResult Show(Window owner, string messageBoxText, string caption)
    {
        return MessageBox.Show(owner, messageBoxText, caption);
    }

    public MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button)
    {
        return MessageBox.Show(messageBoxText, caption, button);
    }

    public MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button)
    {
        return MessageBox.Show(owner, messageBoxText, caption, button);
    }

    public MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon)
    {
        return MessageBox.Show(messageBoxText, caption, button, icon);
    }

    public MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon)
    {
        return MessageBox.Show(owner, messageBoxText, caption, button, icon);
    }

    public MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult)
    {
        return MessageBox.Show(messageBoxText, caption, button, icon, defaultResult);
    }

    public MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult)
    {
        return MessageBox.Show(owner, messageBoxText, caption, button, icon, defaultResult);
    }

    public MessageBoxResult Show(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, MessageBoxOptions options)
    {
        return MessageBox.Show(messageBoxText, caption, button, icon, defaultResult, options);
    }

    public MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, MessageBoxOptions options)
    {
        return MessageBox.Show(owner, messageBoxText, caption, button, icon, defaultResult, options);
    }
}