2010-11-11 72 views
0

,这可能是复杂的解释,但我试试看......MVVM工具包斜挎光链式消息

我想使用Messenger导航到一个新的页面,也可以创建一个新的对象(或通一)。这怎么可能或者我在错误的道路上?

基本上: 点击“添加新人”按钮,它应该调出PersonView并且还应该保存一个人物对象的新实例。

点击“添加人员”按钮,它应该调出相同的PersonView页面,并应接收选中的对象。

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

到目前为止,我有MainPageViewModel它发送

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

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

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

我tryed Frame.Navigate后立即发送一条消息给PersonViewModel MainPage.cs ......但这失去了同步...所以页面没有加载接收PersonMessage,...

所以任何提示,技巧,舔,方法是马丽娟...

谢谢...

回答

1

希望这有助于basicaly这是一个简单的单例类,获取导航框架包含页面后,您可以在视图模型中使用它并导航,并在页面更改时收到通知,因此,您可以更好地控制导航并发送消息,并了解您的页面状态。


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

感谢您的评论。激活屏幕已经工作...踢球者将在发起视图后立即传递/发送对象 – silverfighter 2010-11-12 09:10:07

+0

在contentframe_navigated事件之后,您可以将消息与对象一起发送到处理框架内页面的视图模型,或者您可以封装此事件以创建一个新事件为了班级,得到通知并发送消息,我做了这样的事情,它的工作,但我不知道这是否符合您的需求。亲切的问候。 – 2010-11-12 13:16:13

0

我有同样的问题 - 本质上,你收到消息,打开一个新的窗口还创建视图模型,并把它添加到视图的DataContext。当你在现有对象中实例化你的viewmodel传递或者null等等,那么在你的viewmodel中你可以处理它是一个新的还是现有的对象。

如果使用依赖注入,然后调用从代码隐藏下决心,你处理“添加人的讯息话题等。

+0

我使用ViewModelLocator与Ninject集中。因此,在视图创建视图自动知道什么ViewModel绑定... – silverfighter 2010-11-12 09:07:07

+0

正确 - 我使用与视图模型定位器的统一,除非我需要通过构造函数传递参数,然后我使用我上面描述的方法。这不违反MVVM规则,因为视图不是在视图模型或视图以外的任何位置创建的。 – dnndeveloper 2010-11-13 21:37:22

0

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

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