Silverlight:在页面之间传递复杂对象

时间:2010-01-12 06:10:48

标签: c# .net silverlight .net-3.5

在pageA中,我有一个链接到pageB

的HyperlinkBut​​ton
    private void Link1_Click_1(object sender, RoutedEventArgs e)
    {
        HyperlinkButton btn = sender as HyperlinkButton;
        string url = btn.Tag.ToString();

        this.mainFrame.Navigate(new Uri(url, UriKind.Relative));  
    }

如何使pageB上的COMPLEX对象可用于pageB?

当我重新创建pageB或将其设置为pageA上的公共属性时,我可以访问它吗?

我可以将对象添加到App.xaml中,以便它可以在任何地方使用,但我不认为这是最好的实践

6 个答案:

答案 0 :(得分:2)

我认为最简单的方法是使用全局Context实现来设置/获取数据。

public class Context
{

   static Context _context = null;     
   static object sync = new object();        
   public object Data { get; set; }

   private Context()
   {
   }

   public static Context GetContext()
   {
      if _context == null) 
      {
         lock (sync)
         {
            if _context == null)
            {
               _context = new Context(); 
            }
         }
       }
       return _context;
   }
}

//Load your data, and on any page you need it, just do:
Context c = Context.GetContext();

//set or get c.Data here

如果您有多个变量,可以使用词典根据键设置/获取值

答案 1 :(得分:0)

最小化您在全局或静态结构中放置的数据量总是一个好主意,但有时您不能(轻松地)绕过它。尽管如此,你仍然希望避免它,因为浮动的静态值太多会导致非常奇怪的副作用,难以调试。我通常做的是在我的页面上包含一个Initialize(StatusObject status)方法,我在单击超链接时创建的实例上调用该方法。困难的部分实际上是处理新的PageB实例。最好的方法是将Navigated事件挂钩到将要导航的帧上,并获取NavigationEventArgs.Content值。当然,这意味着您必须担心时间问题,因为导航是异步发生的......

答案 2 :(得分:0)

您还可以使用Session将对象从一个页面传输到另一个页面。

E.g.:-

Page A:
MyComplexObject complex = new MyComplexObject();
Session["cObj"] = complex;

Page B:
if(Session["cObj"] != null){
MyComplexObject new_complex = (MyComplexObject)Session["cObj"];
}

or
MyComplexObject new_complex = Session["cObj"] as MyComplexObject;

答案 3 :(得分:0)

我能找到的最佳方法是在PageA上设置框架的DataContext,然后在pageB中我可以使用以下方式访问数据:

((System.Windows.Controls.Frame)this.Parent).DataContext

答案 4 :(得分:0)

就Silverlight而言,一切都在客户端运行,因此它与我们在asp.net中的客户端服务器架构不同。您可以创建一个静态类,其中包含一些公共属性,您可以将其访问到任何其他页面。

public class Cache
{
   private static Cache _cache;

   private Cache()
   {}

   public Cache Instance
   {
       get
       {
          if(_cache == null)
               _cache = new Cache();
          return _cache;
       }
   } 
   public object CachedData
   {get; set;}
}

在第一页中,您可以这样做  Cache.Instance.CachedData =(object)“Hello World”; 在第二页,你可以做到 string Data =(string)Cache.Instance.CachedData;

如果您觉得有帮助,请标记。

答案 5 :(得分:0)

取决于场景,但隔离存储可能是一个值得考虑的选择。它旨在用于存储数据客户端以减少服务器上的负载,这似乎是基于您所描述的理想情况。