MVVM工具包light Messenger链接消息

MVVM工具包light Messenger链接消息,mvvm,silverlight-4.0,mvvm-light,Mvvm,Silverlight 4.0,Mvvm Light,这可能是复杂的解释,但我给它一个尝试 我想使用Messenger导航到一个新页面,并创建一个新对象(或传递一个)。这是怎么可能的,还是我走错了路 基本上: 单击“添加新人物”按钮,该按钮将显示PersonView,并且还应保存人物对象的新实例 单击“添加人员”按钮,该按钮应显示相同的PersonView页面,并应接收所选对象 消息1=打开Uri/消息2发送现有或新对象 到目前为止,我有MainPageViewModel发送 Messenger.Default.Send<Uri>(.

这可能是复杂的解释,但我给它一个尝试

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

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

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

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

到目前为止,我有
MainPageViewModel
发送

 Messenger.Default.Send<Uri>(...)...
我尝试在
帧之后立即向PersonViewModel发送消息。导航
。。。但这不同步。。。因此,页面未加载以接收
PersonMessage

所以任何提示,技巧,舔,方法都是很好的


谢谢…

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


公共类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) {
     }

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


如果您正在使用依赖项注入,则从处理“add person”消息等的代码隐藏中调用resolve…

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


要实现这一点,在PersonView(与PersonViewModel关联)的代码隐藏中,必须在导航时发送消息(OnNavigatedTo)它的ViewModel包含从查询字符串接收到的信息。

我使用Ninject集中的ViewModelLocator。因此,在创建视图时,视图自动知道要绑定到哪个ViewModel…正确-我使用unity和ViewModel locator,除非我需要通过构造函数传递参数,然后我使用上述方法。这不是violating MVVM规则,因为该视图不是在viewmodel中创建的,也不是在view之外的任何地方创建的。感谢您的评论。激活屏幕已经起作用了…kicker将在启动ViewFrame后立即传递/发送一个对象在contentframe_导航事件之后,您可以将一条消息与您的对象一起发送到在e frame,或者你可以封装这个事件,为类创建一个新的事件,得到通知并发送消息,我做了类似的事情,它成功了,但我不知道这是否符合你的需要。谢谢。
    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) {
     }