1

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

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

绑定:绑定到“Avalonia.Controls.TextBlock”时出错。“文本”:“在‘属性’上找不到 CLR 属性‘名称’”

对于上下文,“属性”类包含“名称”变量,并且我已经确认名称变量已预先填充(程序在我开始尝试形成列表之前打印了名称变量)。

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;
        }
    }
}

类数据(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>

这会产生此错误:

绑定:绑定到“Avalonia.Controls.TextBlock”时出错。“文本”:“找不到 CLR 属性‘属性’

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

产生此错误:

绑定:绑定到“Avalonia.Controls.StackPanel”时出错。“DataContext”:“找不到 CLR 属性‘属性’


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

类数据 (companies.cs) 更新:public class APIData {

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

1 回答 1

1

您正在将字符串“属性”设置为您的DataContext. 然后Binding在 上找不到属性“名称” System.String

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

于 2018-11-30T08:15:43.957 回答