Avalonia UI 绑定错误 "Could not find CLR property"

Avalonia UI Error in binding "Could not find CLR property"

我正在尝试创建一个 MVVM 应用程序,它从 API 中提取数据并将数据放入用于导航程序的列表中。

我遇到的问题是列表产生了这个错误,我不知道为什么:

Binding: Error in binding to "Avalonia.Controls.TextBlock"."Text": "Could not find CLR property 'name' on 'attributes'"

对于上下文,'attributes' class 包含 '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;
        }
    }
}

Class数据(companies.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: Error in binding to "Avalonia.Controls.TextBlock"."Text": "Could not find CLR property 'attributes'

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

产生此错误:

Binding: Error in binding to "Avalonia.Controls.StackPanel"."DataContext": "Could not find CLR property 'attributes'


修复更新: 从 Kekekeks 的回答中,我弄清楚了为什么我的程序无法运行,现在列出了负载。由于使用 JSON.NET,我担心使用构造函数,但我对所有 classes 进行了以下更改,程序显示了预期的列表

Class 数据 (companies.cs) 更新: public class API数据 {

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

您正在将字符串 "attributes" 设置为您的 DataContext。然后 BindingSystem.String.

上找不到 属性 "name"

删除 DataContext="attributes" 并将您的绑定替换为 Text="{Binding attributes.name}"