mvvm light - 使用回调发送通知消息

Eld*_*dho 1 c# wpf mvvm mvvm-light

我需要在我的视图模型中使用FolderBrowserDialog的结果,

CodeBehind.cs

 private static void SelectFolderDialog()
    {
        using (System.Windows.Forms.FolderBrowserDialog folderdialg = new System.Windows.Forms.FolderBrowserDialog())
        {
            folderdialg.ShowNewFolderButton = false;
            folderdialg.RootFolder = Environment.SpecialFolder.MyComputer;

            folderdialg.Description = "Load Images for the Game";
            folderdialg.ShowDialog();
            if (folderdialg.SelectedPath != null)
            {
                var notifypath = new GenericMessage<string>(folderdialg.SelectedPath);
                Messenger.Default.Send(notifypath);

            }
        }
Run Code Online (Sandbox Code Playgroud)

我正在计划的是,从View-model发送带回调的通知到视图,执行FolderBrowserDialog将Selected路径返回给视图模型.

如何使用MVVM-Light发送带回调/ NotificationWithAction的notificationmessage.请帮我一个样本,因为我是Wpf和MVVM-Light的新手.

任何帮助表示赞赏

Ste*_*eve 6

我正在寻找几乎完全相同的东西,除了有一个SaveFileDialog.这是我想出的:

使用Action<string>属性和带Action<string>参数的构造函数创建消息类.

public class SelectFolderMessage
{
    public Action<string> CallBack {get;set;}
    public SelectFolderMessage(Action<string> callback)
    {
         CallBack = callback;
    }
}
Run Code Online (Sandbox Code Playgroud)

在ViewModel类中,在调用时传入方法或lambda表达式Messenger.Default.Send.我在ViewModel类中设置了一个属性,其中包含视图返回的路径.我把它包装在一个的执行部分里面RelayCommand.我绑定RelayCommand了视图中的一个按钮

...
new RelayCommand(() =>
    {
        Messenger.Default.Send(new SelectFolderMessage(
            (pathfromview) => { viewmodelproperty = pathfromview;}));
    })
Run Code Online (Sandbox Code Playgroud)

在后面的视图代码中,创建一个方法来处理消息并使用messenger服务注册处理程序.如果这不是您的主窗口,请不要忘记取消注册.

public MainWindow()
{
    Messenger.Default.Register<SelectFolderMessage>(this, SelectFolderHandler);
}

private void SelectFolderHandler(SelectFolderMessage msg)
{
    using (System.Windows.Forms.FolderBrowserDialog folderdialg = new System.Windows.Forms.FolderBrowserDialog())
    {
        folderdialg.ShowNewFolderButton = false;
        folderdialg.RootFolder = Environment.SpecialFolder.MyComputer;

        folderdialg.Description = "Load Images for the Game";
        folderdialg.ShowDialog();
        if (folderdialg.SelectedPath != null)
        {
            msg.CallBack(folderdialg.SelectedPath);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在MSDN杂志上读到了Laurent Bugnion的Messenger文章:http://msdn.microsoft.com/en-us/magazine/jj694937.aspx

  • 查看上面链接中文章的"实现DialogService"部分.Laurent展示了使用接口和单元测试的示例. (2认同)