SL4 VS2010 MVVM-light c#,messenger。
我有一个父userControl调用 一个子userControl。 (都有 的ViewModels)
我正在使用来自MVVM-light的信使。(孩子是父母Tab中的用户控件)
当孩子需要关闭时,我们必须检查父ViewModel上的某些规则 (父结果是你可以关闭不)。
您如何从child-ViewModel传达父ViewModel?
消息孩子对父母的要求可以关闭吗? 然后,向父母发送消息,让孩子回复是或否,
(我?不喜欢来回传两次)
我真正想知道的是,在ViewModel中是否还有其他方式可以进行这样的通信?
如果父规则不允许孩子关闭,如何对孩子的关闭按钮进行调暗。
感谢您的时间。
答案 0 :(得分:2)
您应该能够在MVVM-Light中使用Messenger来完成此任务。
子窗口发布信使通知,如下所示
var message = new NotificationMessageAction<bool>("CanClose", CloseCallback);
Messenger.Default.Send(message);
您可以定义Action回调,如下所示
private void CloseCallback(bool result)
{
if (result)
... do some work and close, may need to use Dispatcher ...
}
您可以在父级上订阅此通知,如下所示
Messenger.Default.Register<NotificationMessageAction<string>>(
this,
msg =>
{
if (msg.Notification == "CanClose")
{
// Do the necessary UI logic and send the result back
msg.Execute(true);
}
}
如果有帮助,请告诉我。
答案 1 :(得分:0)
很难说,但从您所描述的内容来看,听起来您在父视图模型中有一些属于模型的规则。如果将这些规则推送到模型中,则父虚拟机和子虚拟机都可以使用这些规则。
但是,如果情况并非如此,您可以始终拥有某种发布/订阅关系,父级和子级都会注册,并使用这些事件进行通信。
我倾向于模型方法。
答案 2 :(得分:0)
您有多种选择,但最佳答案可能是在应用程序整体设计的其余部分中最佳选择。尚未提出的一个选项是您的child-ViewModel可以引用父-ViewModel(这可能是在打开子进程的原始消息中提供的),而child-ViewModel可以询问父-ViewModel通过方法或财产需要的任何问题。
来自child-ViewModel的示例查询:
bool canSave = _parentViewModel.CanSave(childInfo)
如果您想使用来自多种父母的孩子,那么您可以创建一个界面,确保实施者拥有一个始终可以从孩子那里调用的CanSave方法。
interface ISaveQuerable
{
bool CanSave(YourType childInfo);
}
这只是一个选项,无论您是使用消息传递还是将ViewModel直接用于ViewModel创建和通信,它都可以使用。主要的想法是,如果您知道父级应该始终实现某些功能,而不是创建回调,那么在消息中提供该事实会强制执行此操作作为消息协定的一部分。那些使用消息创建子节点的人必须提供一些实现接口的东西,并且保证子节点可以通过强类型和编译时检查方式调用。