Avalonia UI Ошибка в привязке «Не удалось найти свойство CLR» - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь создать приложение MVVM, которое извлекает данные из API и помещает данные в списки, которые используются для навигации по программе.

Проблема, с которой я столкнулся, заключается в том, что в списке возникает эта ошибка, и я не могу понять, почему:

Binding: Ошибка в привязке к «Avalonia.Controls.TextBlock». "Текст ":" Не удалось найти свойство CLR "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;
        }
    }
}

Данные класса (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; }
    }


}
}

Что я делаю не так и что нужно изменить?

Обновление: Я пыталсяизменив DataTemplate в XAML следующим образом:

<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»

Исправление обновления: Из ответа Kekekeks я выяснил, почему моя программа не работала, и теперь загружает списки.Из-за использования JSON.NET меня беспокоило использование конструкторов, но я внес следующие изменения во все мои классы, и программа отображает требуемый список

Данные класса (companies.cs) Обновлено: public class APIData {

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

1 Ответ

0 голосов
/ 30 ноября 2018

Вы устанавливаете строку «атрибуты» в качестве DataContext.Тогда Binding не может найти свойство "name" в System.String.

. Удалите DataContext="attributes" и замените привязку на Text="{Binding attributes.name}"

.
...