【问题标题】:mvvm light -Sending Notification message with callbackmvvm light - 发送带有回调的通知消息
【发布时间】:2014-04-07 05:05:31
【问题描述】:

我的视图模型中需要 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);

            }
        }

我的计划是,从 View-model 发送带有回调的通知到 view ,执行 FolderBrowserDialog 将选定的路径返回给视图模型。

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

任何帮助表示赞赏

【问题讨论】:

    标签: c# wpf mvvm mvvm-light


    【解决方案1】:

    我一直在寻找几乎完全相同的东西,除了SaveFileDialog。这是我想出的:

    创建一个带有Action&lt;string&gt; 属性的消息类和一个带有Action&lt;string&gt; 参数的构造函数。

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

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

    【讨论】:

    • 它是一个更好的解决方案。谢谢,如果它的接口驱动,我怎么能管理这个,我也在考虑单元测试能力。
    • 查看上面链接中文章的“实现 DialogService”部分。 Laurent 展示了一个使用接口和单元测试的例子。
    • 2017 年更新:同时(在 MVVMlight.Messaging 中)NotificationMessageActionNotificationMessageAction&lt;&gt;NotificationMessageWithCallback
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多