2011-02-10 4 views
44

페이지간에 데이터를 전달하는 가장 좋은 방법을 찾고 있습니다.페이지에서 페이지로 데이터 전달하기

페이지 B 페이지에서 나가는 버튼이 있습니다.
페이지 B 페이지 6에 사용자가 정보를 입력 할 수있는 텍스트 상자가 있습니다.

    : 사용자가 완료되면 는 페이지 A.

    에 다시를 가져다 버튼의 클릭 난에 제안을 본 적이

    페이지 A에 다시 데이터를 전달하려면

  • 빌드 XML 문서와 격리 된 저장소
  • 에 저장 속성 정보를 쿼리 문자열과 같은
  • 패스를 저장하는 앱 클래스를 사용

모범 사례를 찾고 있습니다. Microsoft에서 권장하는 프로그램이 있습니까? 아니면 일반적으로 가장 좋은 방법으로 받아 들여지는 프로그램이 있습니까? 앱 컨트롤러하자 모델에 모든 데이터를 저장하고, 페이지는 순수 UI 로직을 포함하고 단지 도면이다 : 당신이 고려할 수

답변

63
PhoneApplicationService.Current.State["yourparam"] = param 
NavigationService.Navigate(new Uri("/view/Page.xaml", UriKind.Relative)); 

는 다른 페이지에 간단하게

var k = PhoneApplicationService.Current.State["yourparam"]; 
4

한 가지입니다

덕분에 MVC를 사용합니다. 이 경우 귀하의 페이지는 화가이며 모델 객체를 전달합니다. 이렇게하면 비즈니스 로직과 UI를 쉽게 분리 할 수 ​​있으므로 쉽게 개정 할 수 있습니다.

BTW, Silverlight 및 XAML은 MVC를위한 훌륭한 도구이므로 자연스럽게 매치됩니다.

+0

MVC와 WP7을 사용하여 이와 같은 작업을 수행하는 방법에 대한 간단한 예가 있습니까? – webdad3

+0

정말 간단한 예제가 없지만 "데이터 바인딩 된 응용 프로그램"템플릿을 시작하고 어떻게 작동 하는지를 알기 전까지 필자는 그것을 보았다. –

+1

이것은 도움이 될 것입니다. (ASP에 있긴하지만 실제로 MVC에 대한 데모입니다.) http://agilewarrior.wordpress.com/2010/09/18/silverlight-model-view-controller-mvc-example/ –

3

여기에 몇 가지 놀이가 있습니다. 먼저 사용자가 뒤로 버튼을 사용하여 버튼 대신 페이지 A로 돌아 가면 텍스트 상자의 정보가 교환 되었습니까 (뒤로 = 취소 또는 뒤로 = 확인입니까?)

NavigationService.GoBack (NavigationService.Navigate 대신 NavigationService.Navigate를 사용해야하는 경우 Navigate 호출을 사용하면 반복 키를 누를 때마다 사용자에 대해 모든 종류의 불량 UX가 발생하기 때문에) QueryStrings 옵션이 아닙니다. 페이지는 실제로 WP7 Silverlight nav 시스템에서 서로를 참조 할 수있는 방법이 없으므로 데이터를 보관하는 데 타사를 사용해야합니다. 이를 위해 격리 저장소 (slow & 무겁지만 안전 함), (b) PhoneApplicationService.State 사전을 사용하거나 (c) 응용 프로그램에서 중단 된 일종의 전역 속성 사용 개체 또는 Statics/Singletons를 사용하여 ...

이렇게하면 삭제 표시 동작을주의해야합니다. 페이지에서 OnNavigatedTo 메서드를 처리합니다. (a) 응용 프로그램에서 해당 항목으로 이동합니다. (b) 다시 탐색합니다. 페이지 B에 대한 작업을 완료하거나 (c) 해당 페이지에서 앱을 삭제 표시 한 다음 뒤로 키를 사용하여 응용 프로그램으로 돌아갑니다.

죄송합니다. 직접 답변을 드리지 못해 죄송합니다. 귀하의 상황에 따라 많은 영향을받습니다. 가장 일반적인 경우에는 PhoneApplicationService에서 App State Dictionary를 사용하는 것이 좋습니다 ... 가볍고 사용하기 쉽고 삭제 표시에서 살아남을 수 있습니다. 귀하의 키가 꼭 필요한만큼 고유한지 확인하십시오.

+0

상태를 지울 수있는 방법이 있습니까? 응용 프로그램을 다시 시작하지 않고 새로 시작하기를 원한다고 가정 해 봅시다. – webdad3

23

개인적으로 페이지 A에 액세스 할 수있는 모델 (개체)에 페이지 B에 입력 된 값을 개인적으로 저장합니다.

How to pass the image value in one xaml page to another xaml page in windows phone 7?

Passing a complex object to a page while navigating in a WP7 Silverlight application

How to pass an object from a xaml page to another? : 당신은 페이지 A로 두 번째를 탐색하는 방법에

따라 다음 중 하나 이상은 페이지 사이에 값을 전달 이해하는 데 도움이 usful 수 있습니다

How to pass a value between Silverlight pages for WP7?

How do I navigate from one xaml page to another, and pass values?

2

새 Windows Phone 프로젝트를 만들고 Windows Phone 데이터 바인딩 된 템플릿을 사용하면 대부분의 작업이 완료됩니다.

당신이하고 싶은 것은 ViewModel이 앱의 모든 데이터를 포함하도록 설정하는 것입니다. IsolatedStorage를 사용하여이 데이터를 직렬화 및 비 직렬화하여 응용 프로그램 세션 및 삭제 표시 (Tombstoning)에 저장됩니다.

템플릿에서

당신은 MailViewModelItemViewModel을 알 수 있습니다. MainViewModel은 ObservableCollection of ItemViewModel을 포함하여 애플리케이션에 필요한 모든 데이터를 저장하고 ItemViewModel은 애플리케이션의 개별 데이터 유형을 나타냅니다.

DetailsPage.xaml 페이지에서 각 텍스트 상자를 App.MainViewModel 항목에 바인딩 할 수 있습니다. 사용자가 DetailsPage.xaml에서 데이터를 조작하자마자 ViewModel을 업데이트하려면 바인딩을 TwoWay로 설정하십시오. 필요에 따라 바인딩을 OneWay로 설정 한 다음 변경 사항을 ViewModel에 다시 쓰고 IsolatedStorage에 저장하는 확인 버튼을 사용할 수 있습니다. 여기

는 예 무엇인지와 같은 바인딩 외모 :이 경우 LineOne에서
<TextBlock x:Name="ListTitle" Text="{Binding LineOne}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 

가 ItemViewModel의 속성이며, 사용자가 MainPage에서 항목을 선택하면 페이지가 쿼리 문자열에서이 데이터를 가져 .xaml. 페이지에 대한 DataContext는 데이터 바인딩 된 정보의 출처를 결정합니다.

MainPage가 선택한 항목을 ViewModel에서 DetailsPage로 전달하는 스 니펫입니다.

// Handle selection changed on ListBox 
private void MainListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    // If selected index is -1 (no selection) do nothing 
    if (MainListBox.SelectedIndex == -1) 
     return; 

    // Navigate to the new page 
    NavigationService.Navigate(new Uri("/DetailsPage.xaml?selectedItem=" + MainListBox.SelectedIndex, UriKind.Relative)); 

    // Reset selected index to -1 (no selection) 
    MainListBox.SelectedIndex = -1; 
} 

다음은 DetailsPage가 선택한 항목을 가져 오는 방법입니다.

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    string selectedIndex = ""; 
    if (NavigationContext.QueryString.TryGetValue("selectedItem", out selectedIndex)) 
    { 
     int index = int.Parse(selectedIndex); 
     DataContext = App.ViewModel.Items[index]; 
    } 
} 

위의 기본 템플릿으로 주위를 둘러보고 추가 질문을하십시오.

데이터 바인딩과 ObservableCollection의 장점은 데이터를 업데이트 할 수 있으며 UX가 이러한 변경 사항을 반영한다는 것입니다. 이는 데이터 변경으로 인해 이벤트가 발생하기 때문입니다.

public string LineOne 
{ 
    get 
    { 
     return _lineOne; 
    } 
    set 
    { 
     if (value != _lineOne) 
     { 
      _lineOne = value; 
      NotifyPropertyChanged("LineOne"); 
     } 
    } 
} 

NotifyPropertyChanged()는이 정보를 View에 브로드 캐스팅합니다.

1

간단히 유지하고 기본적으로 해시 테이블 인 PhoneApplicationService.Current.State를 사용할 수도 있습니다.앱에서 오래 머무를 수 있도록하려면 분리 된 저장소에서 마샬링을 구현해야합니다.

Omar가 Windows Phone Databound Template을 사용하는 것이 좋습니다. 그것은 내 제안과 같지만 더 긴 가파른 학습 곡선을 희생시키면서 더 나은 결과 (더 유지하기 쉬운 코드)를 얻을 수 있습니다.

나는 당신이 그것을 나의 길로하고, 다시 Omar의 길을 제안한다.

1

난 .. 이런 식으로 구현 된 여부 올바른 여부를 내가 .. 잘 모릅니다

u는 뉴스 목록 페이지를 클릭하면 그것은을 열어야합니다 뉴스 상세 페이지. 선택한 뉴스 항목 내용을 뉴스 목록 페이지에서 뉴스 세부 정보 페이지로 전달하고 싶습니다.

뉴스 목록 페이지에는 다음과 같은 방법이 있습니다.

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) 
    { 
     NewsDetailsPage newsDetailPage = (e.Content as NewsDetailsPage); 
     if (newsDetailPage != null) 
      newsDetailPage.SelectedNewsItem = SelectedNewsItem; //Contains the news details 
     base.OnNavigatedFrom(e); 
    } 

뉴스 세부 정보 페이지에서 U는 (SelectedNewsItem) 객체에 액세스 할 수 있습니다.

이것은 정확하지 않을 수도 있습니다.

데이터 저장 :

다음
var customers = (List<Customer>) Application.Current.Resources["NavigationParam"]; 

더이 설명과 함께 블로그 게시물입니다 :

Application.Current.Resources.Add("NavigationParam", customers); 

NavigationService.Navigate(new Uri("/Page2.xaml", UriKind.Relative)); 

데이터 검색

관련 문제