我在视图模型中需要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发送带回调的通知到视图,执行FolderBrowserDialog将Selected路径返回给视图模型。
如何使用MVVM-Light发送带回调/ NotificationWithAction的notificationmessage。请帮我一个样本,因为我是Wpf和MVVM-Light的新手。
感谢任何帮助
答案 0 :(得分:6)
我正在寻找几乎完全相同的东西,除了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;}));
})
在后面的视图代码中,创建一个处理消息的方法,并使用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);
}
}
}
我在MSDN杂志中读到了Laurent Bugnion的Messenger文章:http://msdn.microsoft.com/en-us/magazine/jj694937.aspx