2010-01-12 30 views
3

在pageA的之間的一個複雜的對象我有我如何能夠讓pageA的一個複雜的對象提供給頁面B鏈接到頁面B的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)); 
    } 

一個HyperlinkBut​​ton?

當我重新創建pageB或使其成爲pageA上的一個公共屬性時,我可以通過它傳遞它嗎?

我可以添加對象的App.xaml以便它隨處可見,但我不認爲這是最好的初步實踐

回答

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 2010-01-12 06:37:35

+0

@Billy,使用靜態變量並不壞,一組全局變量總是用在幾乎所有的系統中,否則你最終會做太多的傳遞(編組)代碼。然而,在何時使用和何時不使用之間總是存在權衡。但在你的情況下,當需要通過多個類訪問對象時,最好將它放在Global靜態變量中。 – 2010-01-12 07:01:47

+0

同意Akash。如果你遇到了靜態變量問題,你可以在你的App.xaml.cs中暴露一個Dictionary type屬性,然後從任何頁面獲取/設置值,如 App ap =(App )Application.Current; ap.YourProperty = value; – amazedsaint 2010-01-12 09:08:05

0

它總是一個好主意,以儘量減少數據的,放在全局或靜態結構的金額,但有時你不能(輕易地)繞過它。儘管如此,如果可以的話,你還是要避免它,因爲太多的靜態值會導致很難調試的非常奇怪的副作用。我通常所做的是在我的頁面上包含一個Initialize(StatusObject狀態)方法,我調用單擊超鏈接時創建的實例。困難的部分實際上是獲取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

我能找到的最好辦法是設置網頁A幀的DataContext的,然後在頁面B我可以訪問數據:

((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 =(string)Cache.Instance.CachedData;

如果您覺得它有用,請標記它。

0

取決於場景,但隔離存儲可能是一個值得考慮的選項。它旨在用於存儲數據客戶端以減少服務器上的負載,這似乎是基於您所描述的理想情況。

相關問題