MvvmCross将数据从一个viewmodel传递到另一个viewmodel

时间:2015-09-18 05:09:11

标签: xamarin viewmodel mvvmcross

我正在开发Xamarin Android应用程序。我使用private java.sql.`enter code here`Connection con = null; private final String url = "jdbc:sqlserver://"; private final String serverName = "localhost\\PHILIP"; private final String portNumber = "1433"; private final String databaseName = "Payrol"; private final String userName = "sa"; private final String password = "kukaphilip"; public Main() { System.setProperty("java.net.preferIPv6Addresses", "true"); getConnection(); } private String getConnectionUrl() { //System.out.println(java.lang.System.getProperty("java.library.path")); return "jdbc:jtds:sqlserver://localhost;Database=Payrol;integratedSecurity=true"; } private java.sql.Connection getConnection() { try { /*Class.forName("net.sourceforge.jtds.jdbc.Driver");*/ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); con = DriverManager.getConnection(getConnectionUrl()); if (con != null) { System.out.println("Connection Successful!"); String sql = "INSERT INTO payrol.dbo.test values('1','Philip')"; Statement st = con.createStatement(); st.executeUpdate(sql); /*st.setInt(1, 1); st.setString(2, "Philip"); st.execute();*/ }else{ System.out.println("Connection failed"); } } catch (SQLException e) { System.out.println(e.getMessage()); } catch (ClassNotFoundException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } return con; } 格式MvvmCross

现在,我想将数据从一个ViewModels传递到另一个视图模型,但不想导航到ViewModel。我没有导航到ViewModel,而是导航到另一个ViewModel

例如:我有三个ViewModel V1,V2和V3.Now我想将数据从V1传递到V2但是想要导航到V3。​​

这可能吗?

3 个答案:

答案 0 :(得分:3)

请查看MvvmCross Messenger以执行此操作:https://github.com/MvvmCross/MvvmCross-Plugins/tree/master/Messenger

您需要在viewmodel上订阅某些内容:

public class LocationViewModel 
: MvxViewModel
{
private readonly MvxSubscriptionToken _token;

public LocationViewModel(IMvxMessenger messenger)
{
    _token = messenger.Subscribe<LocationMessage>(OnLocationMessage);
}

private void OnLocationMessage(LocationMessage locationMessage)
{
    Lat = locationMessage.Lat;
    Lng = locationMessage.Lng;
}

// remainder of ViewModel
}

答案 1 :(得分:0)

最简单的方法是使用MvvmCross中的This comment suggests。您可以在V2中订阅某种消息,然后在V1中发布该消息,然后单独导航到V3。​​

// subscribing to a certain message type
this.logoutToken = this.messenger.Subscribe<LogoutMessage>(this.HandleLogoutMessage);

// Creating and sending a message
var logoutMessage = new LogoutMessage(this, "You have been logged out.");
this.messenger.Publish(logoutMessage);

注意:MessageToken分配给成员变量很重要(就像在另一个答案中一样),否则它将被垃圾收集器清理。

答案 2 :(得分:0)

上述信使插件的替代方案我建议保存您需要在&#34;服务中共享的数据&#34;,作为MvvmCross管理的单件类服务:

CreatableTypes()
    .EndingWith("Service")
    .AsInterfaces()
    .RegisterAsLazySingleton();

在视图模型中,只需将其添加到构造函数中即可使用该单例:

public WhateverViewModel(IService service)

该服务将是单例,因此您的数据将在应用程序实时循环中持续存在。

因此,在您的一个视图模型中,您可以这样做:

service.SharedData = new SharedData();

在另一个视图模型中:

this.data = service.SharedData