如何从其他Viewmodel获得答案

时间:2011-05-18 00:23:51

标签: c# mvvm-light messaging slf4j

SL4 VS2010 MVVM-light c#,messenger。

  1. 我有一个父userControl调用 一个子userControl。 (都有 的ViewModels)

  2. 我正在使用来自MVVM-light的信使。(孩子是父母Tab中的用户控件)

  3. 当孩子需要关闭时,我们必须检查父ViewModel上的某些规则 (父结果是你可以关闭不)。

  4. 您如何从child-ViewModel传达父ViewModel?

      

    消息孩子对父母的要求可以关闭吗?       然后,向父母发送消息,让孩子回复是或否,

    (我?不喜欢来回传两次)

    我真正想知道的是,在ViewModel中是否还有其他方式可以进行这样的通信?

    如果父规则不允许孩子关闭,如何对孩子的关闭按钮进行调暗。

    感谢您的时间。

3 个答案:

答案 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创建和通信,它都可以使用。主要的想法是,如果您知道父级应该始终实现某些功能,而不是创建回调,那么在消息中提供该事实会强制执行此操作作为消息协定的一部分。那些使用消息创建子节点的人必须提供一些实现接口的东西,并且保证子节点可以通过强类型和编译时检查方式调用。