2010-01-12 3 views
3

pageA에는 pageBSilverlight : 페이지간에 복잡한 개체 전달

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

에 링크되는 HyperlinkButton이 있습니다. pageB에서 pageA에서 COMPLEX 객체를 만들려면 어떻게해야합니까?

어느 쪽이든 내가 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

+0

@Billy, 정적 변수를 사용하는 것은 나쁘지 않습니다. 한 세트의 전역 변수가 거의 모든 시스템에서 항상 사용됩니다. 그렇지 않으면 지나치게 많은 (마샬링) 코드를 처리하게됩니다. 그러나 사용시기와 사용하지 않을 때는 항상 상충 관계가 있습니다. 하지만 귀하의 경우, 객체가 여러 클래스를 통해 액세스해야 할 때 전역 정적 변수에 넣는 것이 좋습니다. –

+0

Akash와 동의합니다.정적 변수에 문제가있는 경우 App.xaml.cs의 Dictionary 유형 속성을 노출 한 다음 임의의 페이지에서 값을 가져 오거나 설정할 수 있습니다 (예 : ). App ap =) Application.Current; ap.YourProperty = value; – amazedsaint

0

그것은 당신이 전역 또는 정적 구조에 넣어 데이터의 양을 최소화하기 위해 좋은 생각, 항상을 얻을 수 있지만, 때로는 (쉽게) 주변을 둘러 볼 수 없습니다. 하지만 너무 많은 정적 값을 주변에 떠 다니게되면 디버그하기가 매우 까다로운 부작용이 생길 수 있으므로 가능한 한 피하기를 원합니다. 내가 일반적으로 한 것은 하이퍼 링크를 클릭 할 때 만들어지는 인스턴스에서 호출하는 페이지에 Initialize (StatusObject status) 메서드를 포함시키는 것입니다. 어려운 부분은 실제로 PageB의 새 인스턴스를 처리합니다. 이를 수행하는 가장 좋은 방법은 탐색 할 프레임에 Navigated 이벤트를 연결하고 NavigationEventArgs.Content 값을 가져 오는 것입니다. 물론, 이것은 네비게이션이 비동기 적으로 발생하기 때문에 타이밍에 대해 걱정해야한다는 것을 의미합니다 ...

0

또한 세션을 사용하여 한 페이지에서 다른 페이지로 개체를 전송할 수 있습니다. 내가 찾을 수

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

클라이언트에서 실행 측면 그래서 우리가 asp.net에있는 것처럼 다른 다음 클라이언트 서버 아키텍처. 정적 클래스를 만들고 공용 속성을 추가하면 다른 페이지에 액세스 할 수 있습니다. 1 페이지, 당신이 Cache.Instance.CachedData = (객체)에 "Hello World"를 할 수에서

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

; 페이지 2에서 수행 할 수있는 작업 string Data = (string) Cache.Instance.CachedData;

유용하다고 생각되면 표시해주세요.

0

시나리오에 따라 다르지만 격리 된 저장소가 고려할 가치가있는 옵션 일 수 있습니다. 이는 서버의 부하를 줄이기 위해 클라이언트 측 데이터를 저장하는 데 사용하기위한 것이며, 이는 사용자가 설명한 것에 기반한 이상적인 시나리오 인 것 같습니다.

관련 문제