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