Silverlight: передача сложного объекта между страницами - PullRequest
3 голосов
/ 12 января 2010

На странице A у меня есть кнопка гиперссылки, которая ссылается на страницу B

    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));  
    }

Как сделать объект COMPLEX на странице A доступным для страницы B?

Или передать его, когда я воссоздаю страницу B, или сделать его общедоступным свойством на странице A, к которому я могу получить доступ?

Я мог бы добавить объект в App.xaml, чтобы он был доступен везде, но я не думаю, что это лучший способ

Ответы [ 6 ]

2 голосов
/ 12 января 2010

Я думаю, что самый простой способ - использовать глобальную реализацию контекста для установки / получения ваших данных.

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

Если у вас несколько переменных, вы можете использовать словарь для установки / получения значений на основе ключей

0 голосов
/ 27 апреля 2011

Зависит от сценария, но стоит рассмотреть вариант с изолированным хранилищем. Он предназначен для хранения данных на стороне клиента с целью уменьшения нагрузки на сервер, и это может показаться идеальным сценарием на основе того, что вы описали.

0 голосов
/ 27 апреля 2011

С точки зрения 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"; На второй странице вы могли бы сделать строка Data = (строка) Cache.Instance.CachedData;

Пожалуйста, отметьте это, если вы найдете это полезным.

0 голосов
/ 13 января 2010

Лучший способ, который я мог найти, - это установить DataContext фрейма на странице A, а затем на странице B я могу получить доступ к данным с помощью:

((System.Windows.Controls.Frame)this.Parent).DataContext
0 голосов
/ 12 января 2010

Вы также можете использовать 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 голосов
/ 12 января 2010

Всегда хорошая идея минимизировать объем данных, которые вы помещаете в глобальные или статические структуры, но иногда вы не можете (легко) обойти это. Тем не менее, вы можете избежать этого, если можете, так как слишком большое количество статических значений может привести к очень странным побочным эффектам, которые трудно отладить. Обычно я включаю в свои методы метод Initialize (StatusObject status), который я вызываю для экземпляра, который создается при нажатии на гиперссылку. Сложная часть заключается в получении дескриптора нового экземпляра PageB. Лучший способ сделать это - подключить событие Navigated к кадру, который будет перемещаться, и захватить значение NavigationEventArgs.Content. Конечно, это означает, что вам нужно беспокоиться о времени, поскольку навигация происходит асинхронно ...

...