2010-01-12 2 views
3

В страницаА У меня есть HyperlinkButton, что ссылки на страницаБSilverlight: Передача сложного объекта между страницами

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 или сделаю его общедоступным на странице. Я могу получить доступ, я думаю?

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

ответ

2

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

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

Это будет работать, но я бы предпочел не использовать статические переменные. Должны быть другие способы? – Billy

+0

@Billy, используя статические переменные isnt bad, один набор глобальных переменных всегда используется почти в каждой системе, иначе вы в конечном итоге делаете слишком много кода прохождения (Marshalling). Однако всегда есть компромисс между тем, когда использовать и когда не использовать. Но в вашем случае, когда к объекту нужно обращаться через несколько классов, полезно добавить его в глобальную статическую переменную. –

+0

Согласовано с Akash.Как бы то ни было, если у вас возникли проблемы со статическими переменными, вы можете открыть свойство типа словаря type в свой App.xaml.cs, а затем получить/установить значения с любой страницы, например App ap = (приложение) Application.Current; ap.YourProperty = значение; – amazedsaint

0

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

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

Лучший способ, которым я мог бы найти было установить DataContext кадра на страницаА, а затем в страницаБ я могу получить доступ к данным с:

((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 = (объект) "Hello World"; На второй странице вы можете сделать string Data = (строка) Cache.Instance.CachedData;

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

0

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