【问题标题】:MVVM Toolkit light Messenger chained MessagesMVVM Toolkit 轻量级 Messenger 链式消息
【发布时间】:2011-05-08 10:28:16
【问题描述】:

这可能解释起来很复杂,但我试一试......

我想使用 Messenger 导航到新页面并创建一个新对象(或传递一个对象)。这怎么可能,还是我走错了路?

基本上: 单击“添加新人”按钮,该按钮应调出 PersonView 并且还应包含人员对象的新实例。

单击“添加人员”按钮,该按钮应显示相同的 PersonView 页面并应接收被选中的对象。

消息 1 = 打开 Uri / 消息 2 发送现有对象或新对象。

到目前为止,我有 MainPageViewModel 发送

 Messenger.Default.Send<Uri>(...)...

以及注册Messenger.Default.Register&lt;Uri&gt;(...)并执行的MainPage.cs

Frame.Navigate(...targetUri)....

我尝试在 Frame.Navigate 之后立即向 PersonViewModel 发送消息...但这不同步...所以页面未加载以接收PersonMessage,...

所以任何提示、技巧、技巧、方法都会很棒......

谢谢...

【问题讨论】:

    标签: mvvm silverlight-4.0 mvvm-light


    【解决方案1】:

    我认为您应该做的是保留第一条导航消息,并在其中添加有关您要发送的对象(人)的信息。您可以在查询字符串中添加一个参数,例如“add=true”,然后您可以在视图模型中正常创建对象,或者要编辑的对象的ID,在这种情况下,视图模型可以检索对象本身并编辑它。

    为了实现这一点,在 PersonView(与 PersonViewModel 相关联)背后的代码中,必须在导航 (OnNavigatedTo) 时向其 ViewModel 发送一条消息,其中包含从查询字符串接收到的信息。

    【讨论】:

      【解决方案2】:

      希望这会有所帮助,基本上它是一个简单的单例类,它获取包含页面的导航框架,之后您可以在视图模型中使用它并进行导航,并在页面更改时收到通知,所以有了这个你以更好的方式控制导航 并发送消息,并了解您的页面状态。


      公共类 NavigationFrameController {

          private static NavigationFrameController _instance;       
          private MainPage _root;
          public Frame NavFrame { get; set;}
          private static object keyLock = new Object();
      
          NavigationFrameController() {
      
              _root = (MainPage)Application.Current.RootVisual;
              NavFrame = _root.ContentFrame;
              NavFrame.Navigated += new NavigatedEventHandler(ContentFrame_Navigated);
              NavFrame.NavigationFailed += new  NavigationFailedEventHandler(ContentFrame_NavigationFailed);
      
          }
      
          public static NavigationFrameController Instance {
              get {
                  if (_instance == null)
                      lock (keyLock) {
                        _instance = new NavigationFrameController();
                     }
                  return _instance;
              }
          }
      
           public void NavigateTo(Uri uri) {
      
              NavFrame.Source = uri;
      
          }
      
           private void ContentFrame_Navigated(object sender, NavigationEventArgs e) {
                //send your message
                // get attached to this event and get notified
      
           }
      
            private void ContentFrame_NavigationFailed(object sender, NavigationFailedEventArgs e) {
           }
      

      【讨论】:

      • 感谢您的评论。激活屏幕已经工作了......踢球者是在启动视图后立即传递/或发送对象
      • 在 contentframe_navigated 事件之后,您可以将带有对象的消息发送到处理框架内页面的视图模型,或者您可以封装此事件为类创建一个新事件,获得通知并发送该消息,我做了类似的事情并且它有效,但我不知道这是否符合您的需求。亲切的问候。
      【解决方案3】:

      我遇到了同样的问题 - 本质上,您在收到打开新窗口的消息的地方也创建了视图模型并将其作为数据上下文添加到视图中。当您在现有对象或 null 等中实例化您的视图模型时...然后在您的视图模型中您可以处理它是新对象还是现有对象。

      如果您使用依赖注入,则从处理“添加人员”消息等的代码隐藏中调用解析。

      【讨论】:

      • 我使用 Ninject 集中的 ViewModelLocator。因此,在创建视图时,视图会自动知道要绑定到哪个 ViewModel...
      • 正确 - 我使用统一视图模型定位器,除非我需要通过构造函数传递参数,然后我使用上面描述的方法。这并不违反 MVVM 规则,因为视图不是在视图模型或视图以外的任何地方创建的。
      猜你喜欢
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 2013-08-29
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多