MVVM Toolkit light Messenger链接消息

时间:2010-11-11 11:56:20

标签: mvvm silverlight-4.0 mvvm-light

这可能很难解释,但我试一试......

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

基本上: 单击“添加新人”按钮,该按钮将显示PersonView,并且还应该保存人物对象的新实例。

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

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

到目前为止,我发送了MainPageViewModel

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

注册Messenger.Default.Register<Uri>(...)并执行

的MainPage.cs
Frame.Navigate(...targetUri)....

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

所以任何提示,技巧,舔,方法都会变得很重要......

...谢谢

3 个答案:

答案 0 :(得分:1)

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


public class 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) {
     }

答案 1 :(得分:0)

我遇到了同样的问题 - 基本上你收到打开新窗口的消息也会创建viewmodel并将其作为datacontext添加到视图中。当您在现有对象中实例化viewmodel传递或null等时...然后在您的viewmodel中,您可以处理它是新对象还是现有对象。

如果您正在使用依赖注入,请从处理“添加人员”消息等的代码隐藏中调用解决方案。

答案 2 :(得分:0)

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

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