2016-05-12 27 views
0

私のviewmodelのコレクションプロパティをGridViewにバインドする際にいくつかの問題があります。私はMVVMの光を使用していると私は正しくViewModelLocatorの設定を持っていると、ページのxamlでDataContextの設定を持っていると思います。問題バインディングGridview itemsourceをviewmodelプロパティ

モデル

public class Base 
{ 
    public ObservableCollection<Downloads> results { get; set; } 
} 
public class Downloads 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public int trackNumber { get; set; } 
    public string mixName { get; set; } 
    public string title { get; set; } 
    public string slug { get; set; } 
    public string releaseDate { get; set; } 
    public string publishDate { get; set; } 
    public List<Artist> artists { get; set; } 
    public string artistNames 
    { 
     get 
     { 
      return (artists == null) 
       ? string.Empty 
       : string.Join(", ", artists.Select(a => a.name)); 
     } 
    } 
    public string artistNamesSlug 
    { 
     get 
     { 
      return (artists == null) 
       ? string.Empty 
       : string.Join("_", artists.Select(a => a.name)); 
     } 
    } 

    public Release release { get; set; } 
    public Label label { get; set; } 
    public Image images { get; set; } 
    public int downloadId { get; set; } 
    public string audioFormat { get; set; } 
    public string downloadUrl { get; set; } 
} 
public class Release 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public string type { get; set; } 
    public string slug { get; set; } 
} 
public class Label 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public string type { get; set; } 
    public string slug { get; set; } 
    public bool status { get; set; } 
} 
public class Image 
{ 
    public LargeImage large { get; set; } 
} 
public class LargeImage 
{ 
    public int id { get; set; } 
    public int width { get; set; } 
    public int height { get; set; } 
    public string url { get; set; } 
    public string secureUrl { get; set; } 
} 

のViewModel

public class AvailableViewModel : ViewModelBase 
{ 

    public AvailableViewModel() 
    { 

    } 

    private Base availableDownloads; 
    public Base AvailableDownloads 
    { 
     get 
     { 
      if(availableDownloads == null) 
      { 
       GetData(); 
      } 
      return availableDownloads; 
     } 
     set 
     { 
      availableDownloads = value; 
      RaisePropertyChanged(() => AvailableDownloads); 
     } 
    } 

    private async void GetData() 
    { 
     OAuth oauth = new OAuth(); 

     string httpMethod = "GET"; 
     string parameters = "status=available"; 
     string response = await oauth.GetData(OAuth.availDownloadsUrl, httpMethod, parameters); 

     Base availableDownloads = JsonConvert.DeserializeObject<Base>(response); 
    } 
} 

XAML

DataContext="{Binding Available, Source={StaticResource Locator}}"> 

<Page.Resources> 
    <DataTemplate x:Key="AvailableGridView"> 
     <Grid Margin="0,10,0,0"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="2*"/> 
      </Grid.ColumnDefinitions> 
      <Image Source="{Binding AvailableDownloads.images.large.url}" Grid.Column="0" /> 
      <StackPanel Grid.Column="1" VerticalAlignment="Top" Margin="20,0,0,0"> 
       <TextBlock Text="{Binding AvailableDownloads.title}" Style="{StaticResource BaseTextBlockStyle}" TextWrapping="Wrap"/> 
       <TextBlock Text="{Binding AvailableDownloads.release.name}" Style="{StaticResource BaseTextBlockStyle}"/> 
       <TextBlock Text="{Binding AvailableDownloads.artistNames}" Style="{StaticResource SubtitleTextBlockStyle}"/> 
      </StackPanel> 
     </Grid> 
    </DataTemplate> 
</Page.Resources> 


<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <GridView ItemsSource="{Binding AvailableDownloads.results}" SelectionMode="Multiple" ItemTemplate="{StaticResource AvailableGridView}"/> 
</Grid> 

これが問題の一部である可能性がありますが、私はXAMLでのDataContextを設定する際のレイアウトは、オブジェクトを表示します参照エラー。私はそれがなぜ起こるのか分かりませんが、アプリケーションはコンパイルされ実行されます。私はMVVMを初めて使っているので、なぜ私のバインディングがここで働いていないのか分かりません。

答えて

0

これは問題の一部である可能性がありますが、xamlにDataContextを設定すると、レイアウトにオブジェクト参照エラーが表示されます。

この「オブジェクト参照エラー」NullReferenceExceptionエラーですか?あなたのコードは包括的ではないので、私はこの問題をいくつかの場所で再現することができますが、あなたの問題の原因を正確にはわかりません。

まず私はここでのテストのためのあなたのXAMLコードを変更し、私は、x使用:GridViewDataTemplateにバインド:

... 
    DataContext="{Binding Available, Source={StaticResource Locator}}" 
    xmlns:model="using:[Namespace of your app].Model"> 
<Page.Resources> 
    <DataTemplate x:Key="AvailableGridView" x:DataType="model:Downloads"> 
     <Grid Margin="0,10,0,0"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*" /> 
       <ColumnDefinition Width="2*" /> 
      </Grid.ColumnDefinitions> 
      <!--<Image Source="{x:Bind downloadUrl}" Grid.Column="0" />--> 
      <StackPanel Grid.Column="1" VerticalAlignment="Top" Margin="20,0,0,0"> 
       <TextBlock Text="{x:Bind title}" Style="{StaticResource BaseTextBlockStyle}" TextWrapping="Wrap" /> 
       <TextBlock Text="{x:Bind release.name}" Style="{StaticResource BaseTextBlockStyle}" /> 
       <TextBlock Text="{x:Bind artistNames}" Style="{StaticResource SubtitleTextBlockStyle}" /> 
      </StackPanel> 
     </Grid> 
    </DataTemplate> 
</Page.Resources> 

<Grid> 
    <GridView ItemsSource="{Binding AvailableDownloads.results}" SelectionMode="Multiple" ItemTemplate="{StaticResource AvailableGridView}" /> 
</Grid> 

そして、私はこのようなあなたのBaseクラス変更:この

public class Base 
{ 
    public ObservableCollection<Downloads> results { get; set; } 

    public Base() 
    { 
     results = new ObservableCollection<Downloads>(); 
    } 
} 

をデータを追加するときにObservableCollection<Downloads>の新しいインスタンスを作成しないと、可能性があります。

そして、私はこのようなあなたのAvailableViewModel()を変更し、resultに追加されたデータは、単にテストのために、偽です:

public AvailableViewModel() 
{ 
    availableDownloads = new Base(); 
    availableDownloads.results.Add(new Downloads { title = "11111", artistNames = "222", release = new Release(0, "333", "", "") }); 
    availableDownloads.results.Add(new Downloads { title = "11111" }); 
    availableDownloads.results.Add(new Downloads { title = "11111" }); 
    availableDownloads.results.Add(new Downloads { title = "11111" }); 
    availableDownloads.results.Add(new Downloads { title = "11111" }); 
} 

あなたが見ることができるように、私はここにBaseクラスの新しいインスタンスを作成しました。

は、私はあなたのXAMLコードで、あなたがこのために、release.nameを使用していることに気づいた、私はあなたがこのようなあなたのReleaseクラスを変更する必要があると思う:

public class Release 
{ 
    public Release() 
    { 
    } 

    public Release(int Id, string Name, string Type, string Slug) 
    { 
     this.id = Id; 
     this.name = Name; 
     this.type = Type; 
     this.slug = Slug; 
    } 

    public int id { get; set; } 
    public string name { get; set; } 
    public string type { get; set; } 
    public string slug { get; set; } 
} 

をそして、あなたは、このようなReleaseクラスのインスタンスを作成することができます。

release = new Release(0, "333", "", ""); 

私はこの仕事をするために、あなたのDataTemplateImage制御をコメントし、あなたがReleaseのようなあなたのLargeImageImageを変更する必要がありますクラス。

関連する問題