1

API からデータを取得し、プログラムをナビゲートするために使用されるリストにデータを配置する MVVM アプリケーションを作成しようとしています。

私が抱えている問題は、リストがこのエラーを生成し、その理由を理解できないことです:

Binding: "Avalonia.Controls.TextBlock"."Text" へのバインドでエラーが発生しました: "'attributes' に CLR プロパティ 'name' が見つかりませんでした"

文脈上、「attributes」クラスには「name」変数が含まれており、事前に name 変数が入力されていることを確認しました (リストの作成に移る前に、プログラムは name 変数を出力しました)。

XAML コード (MainWindow.xaml):

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:RT_Stream_App.ViewModels;assembly=RT_Stream_App"
        Icon="resm:RT_Stream_App.Assets.avalonia-logo.ico"
        Title="RT Stream App">

  <Design.DataContext>
    <vm:MainWindowViewModel/>
  </Design.DataContext>

  <ListBox Items="{Binding CompanyList}" HorizontalAlignment="Left" Width="512" Height="512" Margin="20,20,0,10" VerticalAlignment="Top">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <StackPanel DataContext="attributes">
          <TextBlock Text="{Binding name}" TextAlignment="Center" />
        </StackPanel>
      </DataTemplate>
    </ListBox.ItemTemplate>
  </ListBox>
  <!-- <TextBlock Text="{Binding Greeting}" HorizontalAlignment="Center" VerticalAlignment="Center"/>  -->


</Window>

MainWindowViewModel.cs

namespace RT_Stream_App.ViewModels
{
    public class MainWindowViewModel : ViewModelBase
    {
        // use => instead of = for assigning
        // public string Greeting => "I am testing!";

        public companies.APIData siteList => loadCompanies();

        //public string Greeting => TestLoop(siteList);
        public ObservableCollection<companies.companyData> CompanyList => siteList.data;

        public companies.APIData loadCompanies()
        {
            // This takes the API data for companies and converts it into a useable class
            companies.APIData toReturn = JsonConvert.DeserializeObject<companies.APIData>(new WebClient().DownloadString("https://svod-be.roosterteeth.com/api/v1/channels"));
            return toReturn;
        }
    }
}

クラス データ (companys.cs):

namespace RT_Stream_App.Classes
{

public class companies
{
    /// <summary>
    /// Root of the JSON
    /// </summary>
    public class APIData
    {
        public ObservableCollection<companyData> data = new ObservableCollection<companyData>();
    }

    /// <summary>
    /// A class that holds the data for each company (Name and link mostly)
    /// </summary>
    public class companyData
    {
        public attributeData attributes = new attributeData();
        public linkData links = new linkData();
    }

    /// <summary>
    /// Contains the company name
    /// </summary>
    public class attributeData
    {
        public string name { get; set; }
    }

    /// <summary>
    /// Contains link data for the next step
    /// </summary>
    public class linkData
    {
        public string shows { get; set; }
    }


}
}

何が間違っていて、何を変更する必要がありますか?

更新: XAML の DataTemplate を次のように変更しようとしました。

<DataTemplate>
        <StackPanel>
          <TextBlock Text="{Binding attributes.name}" TextAlignment="Center" />
        </StackPanel>
      </DataTemplate>

このエラーが発生します:

Binding: "Avalonia.Controls.TextBlock"."Text" へのバインドでエラーが発生しました: "CLR プロパティ '属性' が見つかりませんでした

<DataTemplate>
        <StackPanel DataContext="{Binding attributes}">
          <TextBlock Text="{Binding name}" TextAlignment="Center" />
        </StackPanel>
      </DataTemplate>

次のエラーが発生します。

Binding: "Avalonia.Controls.StackPanel"."DataContext" へのバインドでエラーが発生しました: "CLR プロパティ 'attributes' が見つかりませんでした


更新の修正: Kekekeks の回答から、プログラムが機能しない理由がわかり、リストが読み込まれるようになりました。JSON.NETを使用しているため、コンストラクターの使用について心配していましたが、すべてのクラスに次の変更を加えたところ、プログラムは意図したリストを表示します

クラス データ (companys.cs) 更新: public class APIData {

            public APIData()
            {
                this.data = new ObservableCollection<companyData>();
            }
            public ObservableCollection<companyData> data {
                get;
                set;
                }
            }
4

1 に答える 1