mvvm 灯 - 发送带有回调的通知消息

本文关键字:回调 通知 消息 mvvm | 更新日期: 2023-09-27 17:57:15

我需要在我的视图模型中获得 FolderBrowserDialog 的结果,

代码隐藏.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);
            }
        }

我的计划是,从视图模型发送带有回调的通知视图,执行文件夹浏览器对话框将所选路径返回视图模型。

如何使用 MVVM-Light 发送带有回调/通知与操作的通知消息。请帮助我提供一个示例,因为我是 WPF 和 MVVM-Light 的新手。

任何帮助不胜感激

mvvm 灯 - 发送带有回调的通知消息

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

创建一个具有 Action<string> 属性的邮件类和一个带有 Action<string> 参数的构造函数。

public class SelectFolderMessage
{
    public Action<string> CallBack {get;set;}
    public SelectFolderMessage(Action<string> callback)
    {
         CallBack = callback;
    }
}

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

...
new RelayCommand(() =>
    {
        Messenger.Default.Send(new SelectFolderMessage(
            (pathfromview) => { viewmodelproperty = pathfromview;}));
    })

在视图代码隐藏中,创建一个方法来处理消息,并将处理程序注册到信使服务。如果这不是您的主窗口,请不要忘记取消注册。

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);
        }
    }
}

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