2017-05-24 10 views
1

グリッドを非同期データで読み込むのに苦労しています。GridViewのAPIからJSON非同期を取得する

私はこのクラッシュ/エラーを取得していますが、私はまだデータがないので、私は仮定していますか?

enter image description here

私はhttp://ramsey.api.com/helloからJSONで引っ張ってるのと同じくらい簡単です::しかし、私は全くわからないんだけどすべてがうまくで引っ張っている

[{ 
    "middleName": "Sarco", 
    "firstName": "Marco", 
    "city": "Neverland", 
    "lastName": "Ramsey" 
}, { 
    "middleName": "Jarco", 
    "firstName": "Taco", 
    "city": "Niagra", 
    "lastName": "Ramsey" 
}] 

、と私はまた、マッピングよ

public class Ramsey 
{ 
    public string firstName { get; set; } 
    public string city { get; set; } 
    public string lastName { get; set; } 
    public string middleName { get; set; } 
} 

しかし、データをプルしてグリッドバインディングにマップしようとすると、エラーが発生します。ここで私が使用している方法は次のとおりです。

public static async Task<List<Ramsey>> GetListAsyncModelPeopleManager() 
    { 
     var ramsey = new List<Ramsey>(); 

     var api = "http://ramsey.api.com/hello"; 
     var client = new HttpClient(); 
     var response = await client.GetAsync(api); 
     var result = await response.Content.ReadAsStringAsync(); 

     IEnumerable<Ramsey> results = JsonConvert.DeserializeObject<IEnumerable<Ramsey>>(result); 

     foreach (Ramsey r in results) 
     { 

      var first = r.firstName; 
      var middle = r.middleName; 
      var last = r.lastName; 
      var city = r.city; 

      var item = new Ramsey(); 
      item.firstName = first; 
      item.middleName = middle; 
      item.lastName = last; 
      item.city = city; 

      ramsey.Add(item); 
     } 

     return ramsey; 
    } 


} 

私はこれでハードコーディングされたデータを実行することができ、それは大丈夫ですので、私は私のバインディングはグリッドを見つけるされている知っている:

public static List<Ramsey> GetListSyncModelPeopleManager() 
    { 
     var ramsey = new List<Ramsey>(); 
     ramsey.Add(new Ramsey { firstName = "Marco", city = "No City", lastName = "Ramsey" }); 
     ramsey.Add(new Ramsey { firstName = "Karpo", city = "Niagra", lastName = "Cropo" }); 
     ramsey.Add(new Ramsey { firstName = "Sarco", city = "Nacity", lastName = "Ramsey" }); 

     return ramsey; 
    } 

私はこれに新しいですよだから私はまだStephen Cleary'sMSDN'sのようなドキュメントをチェックしていても、すべてを理解しようとしています。要求ごと

EDIT

ここで例外では:

System.ArgumentException occurred 
    HResult=0x80070057 
    Message=Value does not fall within the expected range. 
    Source=<Cannot evaluate the exception source> 
    StackTrace: 
    at Windows.UI.Xaml.Controls.ItemsControl.put_ItemsSource(Object value) 
    at qlckitWindows.MainPage.XamlBindingSetters.Set_Windows_UI_Xaml_Controls_ItemsControl_ItemsSource(ItemsControl obj, Object value, String targetNullValue) in \\Mac\code_repository\KIT\kitWindows\kitWindows\obj\x86\Debug\MainPage.g.cs:line 26 
    at qlckitWindows.MainPage.MainPage_obj1_Bindings.Update_list3(Task`1 obj, Int32 phase) in \\Mac\code_repository\QLC\qlckitWindows\qlckitWindows\obj\x86\Debug\MainPage.g.cs:line 248 
    at qlckitWindows.MainPage.MainPage_obj1_Bindings.Update_(MainPage obj, Int32 phase) in \\Mac\code_repository\QLC\qlckitWindows\qlckitWindows\obj\x86\Debug\MainPage.g.cs:line 240 
    at qlckitWindows.MainPage.MainPage_obj1_Bindings.Update() in \\Mac\code_repository\QLC\qlckitWindows\qlckitWindows\obj\x86\Debug\MainPage.g.cs:line 213 
    at qlckitWindows.MainPage.MainPage_obj1_Bindings.Initialize() in \\Mac\code_repository\QLC\qlckitWindows\qlckitWindows\obj\x86\Debug\MainPage.g.cs:line 207 
    at qlckitWindows.MainPage.MainPage_obj1_Bindings.Loading(FrameworkElement src, Object data) in \\Mac\code_repository\QLC\qlckitWindows\qlckitWindows\obj\x86\Debug\MainPage.g.cs:line 230 

そして、ここでは、私は私のデータグリッドののItemsSourceをバインドする方法を示します。

実際
<GridView x:Name="RamseyGridView" ItemsSource="{x:Bind list4}" IsItemClickEnabled="True" ItemClick="GridView_ItemClick"> 
     <GridView.ItemTemplate> 
       <DataTemplate x:DataType="data:Ramsey"> 
        <StackPanel x:Name="RamseyStackPan" Orientation="Horizontal" HorizontalAlignment="Center"> 
        <StackPanel x:Name="RamseyStackPanel" Margin="20,20,0,0" Background="LightGray" > 
         <TextBlock x:Name="RamseyFirstName" FontSize="18" Text="{x:Bind firstName}" HorizontalAlignment="Center"></TextBlock> 
         <TextBlock x:Name="RamseyLastName" FontSize="10" Text="{x:Bind lastName}" HorizontalAlignment="Center"></TextBlock> 
        </StackPanel> 
       </StackPanel> 
      </DataTemplate> 
     </GridView.ItemTemplate> 
    </GridView> 
+0

エラーは何ですか? – NicoRiff

+0

質問/回答ありがとう!私はクラッシュして、それは私が質問に入れたスクリーンショットにあるので、何が起こるかは、 "MainPage.g.cs"ファイルを開くクラッシュを得ることです。 "値が予想される範囲内に収まらないというエラーが表示されます"何か案は?あなたが他のQを持っているかどうか教えてください。ありがとう! – SRMR

+0

デザインビューを開くとどうなりますか?例外が発生したときに持っているコールスタックを投稿することはできますか? – Chadley08

答えて

2

、とあなたの方法ハードコードされた値は、実際のメソッドと全く同じことを返すわけではありません。最初のコードサンプルではTask<List<Ramsey>>が返され、ハードコードされたコードサンプルでは平文が返されます。List<Ramsey>

ここに私が自分にポイントを証明するために作ったコードサンプルがあります。

私のデータクラス:

public class DataModel 
{ 
    public string Name { get; set; } 
    public string city { get; set; } 
} 

機能:

public static async Task<List<DataModel>> GetListAsync() 
{ 
    await Task.Delay(500); 

    var list = new List<DataModel> 
    { 
     new DataModel() { Name = "me", City = "Atlantis" }, 
     new DataModel() { Name = "you", City = "Timbuktu" } 
    }; 
    return list; 
} 

public static List<DataModel> GetList() 
{ 
    var list = new List<DataModel> 
    { 
     new DataModel() { Name = "me", City = "Atlantis" }, 
     new DataModel(0 { Name = "you, City = "Timbuktu" } 
    } 
    return list; 
} 

だから、心の中でこれらの機能とXAMLという名前のDataGrid内のDataGrid持つメイン・ウィンドウクラスを持つ:

<Window x:Class="WpfApp1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://sxhemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://xchemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://sxhemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApp1" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <DataGrid x:Name="dataGrid" /> 
    </Grid> 
</Window> 

次に、次のコンストラクタは正常に動作し、データグリッドにデータが入ります:

public MainWindow() 
{ 
    InitializeComponent(); 

    dataGrid.ItemsSource = GetList(); 
} 

次のコンストラクタでもあるため、タスクのコンパイルされません返さ:

public MainWindow() 
{ 
    InitializeComponent(); 

    dataGrid.ItemsSource = GetListAsync(); 
} 

を次のコンストラクタは、コンパイルが、プログラムがハングアップしているように発生します

public MainWindow() 
{ 
    InitializeComponent(); 

    var data = GetListAsync(); 
    dataGrid.ItemsSource = data.Result; 
} 

そして、ここです実際に動作するコンストラクタ:

public MainWindow() 
{ 
    InitializeComponent(); 

    LoadData(); 

    //placing a function within a method is available in C#7 (Visual Studio 2017) 
    //if you're using an older editor or C# version, just make this a private method of the MainWindow class 
    async void LoadData() 
    { 
     dataGrid.ItemsSource = await GetListAsync(); 
    } 
} 

DataGridのItemsSourceプロパティをどのようにバインドしているのかわかりませんが、おそらくXAMLでこれを行っているようで、XAMLのバインディングメソッドがそのタスクを窒息させているようです。その最後のコンストラクタで示したようにAsync Voidメソッドを使って何らかの初期設定に変更した場合、それはうまくいくはずです。

+0

素晴らしい!だから私はこれが論理の小さなスポットが欠落している場所に意味を持ち始めていると思います!あなたの答えを見て、私のデータクラスはこれまでのところよく見える... – SRMR

+0

私は関数になると、私はあなたが両方のメソッドを表示しているのだろうかと思うが、実際には 'GetListAsync'方法?その方法の中で、私のようにAPIからデータモデルアイテムを引き出すのではなく、データモデルアイテムをハードコーディングしているように見えますか? – SRMR

+0

xamlの場合、、次にという名前が付けられています。があり、その中にがあります。どうすればいいですか、少し編集しましたか? – SRMR

関連する問題