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

3
在pageA中,我有一个HyperlinkButton链接到pageB页面。
    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));  
    }

我该如何让页面A上的复杂对象在页面B中可用?

我猜可以在重新创建页面B时将其传递进去,或者在页面A上将其作为公共属性以便我可以访问?

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

6个回答

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

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


那样做可以,但我宁愿不使用静态变量。肯定还有其他方法吧? - Billy
@Billy,使用静态变量并不是坏事。几乎每个系统都会使用一组全局变量,否则你最终会做太多的传递(编组)代码。然而,在何时使用和何时不使用之间总是存在权衡。但在你的情况下,当对象需要通过多个类访问时,将其放入全局静态变量中是很好的选择。 - Akash Kava
同意Akash的观点。但是,如果您对静态变量有问题,您可以在App.xaml.cs中公开一个Dictionary<string,object>类型属性,然后从任何页面获取/设置值,例如App ap = (App)Application.Current; ap.YourProperty=value; - amazedsaint

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;

0

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

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

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;
如果您觉得有用,请标记它。

0

尽量减少放置全局或静态数据的数量总是一个好主意,但有时你无法(轻松地)避免。尽管如此,如果可以避免,则要避免,因为太多静态值会导致非常奇怪的副作用,难以调试。我通常会在我的页面上包括一个 Initialize(StatusObject status)方法,我在单击超链接时调用创建的实例上调用该方法。困难的部分实际上是获得对PageB的新实例的句柄。最好的方法是钩住将进行导航的框架上的Navigated事件,并抓取NavigationEventArgs.Content值。当然,这意味着你必须担心定时问题,因为导航是异步发生的...


0

根据情况而定,但是孤立存储可能是值得考虑的选项。它旨在用于客户端存储数据,以减少服务器负载,根据您所描述的情况,这似乎是一个理想的方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接