这可能很难解释,但我试一试......
我想使用Messenger导航到新页面并创建一个新对象(或传递一个)。这怎么可能,或者我走错了路?
基本上: 单击“添加新人”按钮,该按钮将显示PersonView,并且还应该保存人物对象的新实例。
单击“添加人员”按钮,该按钮将显示相同的PersonView页面,并且应该接收所选的对象。
消息1 =打开Uri /消息2发送现有或新对象。
到目前为止,我发送了MainPageViewModel
Messenger.Default.Send<Uri>(...)...
注册Messenger.Default.Register<Uri>(...)
并执行
Frame.Navigate(...targetUri)....
我尝试在Frame.Navigate
之后立即向PersonViewModel发送消息...但这不同步...因此页面未加载以接收PersonMessage
,... < / p>
所以任何提示,技巧,舔,方法都会变得很重要......
...谢谢
答案 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发送包含查询字符串中收到的信息的消息。