2017-12-18 2 views
0

페이지를 탐색하고 동시에 데이터를 바인드하려고합니다.mvvm을 사용하여 xamarin 양식의보기간에 데이터 전달

이 내가 시도 것입니다 :

public ICommand GetIdeasCommand 
{ 
    get 
    { 
     return new Command(async() => 
     { 
      Ideas = await _apiServices.GetIdeasAsync(); 
      await Application.Current.MainPage.Navigation.PushAsync(new IdeasSinglePage(Ideas)); 
     }); 
    } 
} 

그것은 내가 JSON에서 얻을 배열의 목록입니다 아이디어를 생각한다. 그러나 빈 페이지를 얻은 이래로이 접근법은 도움이되지 못합니다. 또한 페이지 내부에서이 함수를 호출하면 모든 것이 정상입니다. How to pass a parameter from one Page to another Page in Xamarin.Forms?

내보기 :

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
     x:Class="Ideas.Pages.IdeasSinglePage" 
     xmlns:vm="clr-namespace:Ideas.ViewModel;assembly=Ideas" 
      Title="My Page"> 

<ContentPage.BindingContext> 
    <vm:IdeasViewModel/> 
</ContentPage.BindingContext> 

 <ListView.ItemTemplate> 
      <DataTemplate> 
       <ViewCell> 
        <StackLayout Padding="20, 10"> 
         <Label Text="{Binding Ideas}" 
           FontSize="12" 
           TextColor="RoyalBlue"/> 
        </StackLayout> 
       </ViewCell> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 

코드 숨김

public partial class IdeasSinglePage : ContentPage 
{ 
    public IdeasSinglePage(List<Models.Ideas> ideas) 
    { 

     InitializeComponent(); 
     this.BindingContext = new IdeasSinglePage(ideas); //the app breaks here 
    } 
} 

감사 이 포스팅은 저에게 아이디어를 주었다.

+0

예상 출력은 얼마나됩니까? 'IdeasSinglePage'에 컨트롤이 있습니까? – EvZ

+0

'Ideas = await _apiServices.GetIdeasAsync();'@EvZ –

+0

에서 얻은 정보로보기를 채우고 싶습니다. 존재하는 경우 IdeasSinglePage 코드 숨김과 XAML을 공유하십시오. @Aldo – EvZ

답변

0

BindingContext에 대한 이해가 부족합니다. 통상, ViewModel를 BindingContext에 바인드합니다. 당신이 이해가되지 않습니다 여기

this.BindingContext = new IdeasSinglePage(ideas); //the app breaks here

을하고 있습니다.

로드하려는 페이지를 컨텍스트로 전달하고 있습니까? 이 행을 완전히 삭제하십시오.

public partial class IdeasSinglePage : ContentPage 
{ 
    public IdeasSinglePage(List<Models.Ideas> ideas) 
    { 
    InitializeComponent(); 
    listViewName.ItemsSource = ideas; 
    } 
} 

을 그리고 당신의 XML에 당신은 당신의 목록보기에 이름을 지정 : 최근 의견에 있기 때문에 당신은 당신이 뷰 모델은, 당신이 당신의 코드 숨김에서 할 것이다 것은 시작하지 않았다. 이 이름은 코드 숨김 목록을 참조 할 때 필요합니다.

희망 하시겠습니까?

+0

당신은 전적으로 @greggz입니다. 설명 주셔서 감사합니다, 정말로 그것을 평가 :). –

+0

@Aldo Np 및 해피 코딩;) – Greggz

1

당신의 문제는 분명합니다, 당신은 ContentPage에 데이터를 전달하고 있지만 아무 것도하지 않습니다. 일반적으로 한 ViewModel에서 다른 ViewModel으로 매개 변수를 전달하는 것은 매우 간단한 문제입니다.
1. 왜 두 번째 페이지에서 직접 데이터를 다운로드 할 수 없습니다 : 몇 가지 질문이이 솔루션을 찾고, 지금

public class MyFirstPage : ContentPage 
{ 
    public MyFirstPage() 
    { 
    this.BindingContext = new MyFirstPageViewModel(); 
    } 
} 

public class MyFirstPageViewModel : INotifyPorpertyChanged 
{ 
    public ICommand<List<string>> DownloadDataCmd { get; } 

    public MyFirstPageViewModel() 
    { 
    DownloadDataCmd = new Command<List<string>>(async() => { 
     var data = await dataService.DownloadData(); 
     await navService.PushAsync(new MySecondPage(data)); 
    }); 
    } 
} 

public class MySecondPage : ContentPage 
{ 
    public MySecondPage(List<string> downloadedData) 
    { 
    this.BindingContext = new MySecondPageViewModel(downloadedData); 
    } 
} 

public class MySecondPageViewModel : INotifyPropertyChanged 
{ 
    public List<string> Data { get; } 
    public MySecondPageViewModel(List<string> downloadedData) 
    { 
    // Do whatever is needed with the data 
    Data = downloadedData; 
    } 
} 

: 여기

XAML없는 그림이다?
2. 앱에서 캐시 또는 db에 데이터를 저장해야하는 이유는 무엇입니까?

관련 문제