Привязка данных к списку после получения JSON - PullRequest
1 голос
/ 17 марта 2019

Я пытаюсь понять MVVM и испытываю затруднения с получением моего списка, чтобы показать элементы из наблюдаемой коллекции. У меня нет проблем с получением JSON в классах, которые я настроил, но с чтением xaml привязка не работает. Я не совсем ясно, как настроить это, чтобы иметь возможность читать свойства из data2. Может кто-нибудь указать мне, что я делаю неправильно?

Из reddit мне нужно получить каждый Base.Data.Children.data.title. 0-24 детей, поэтому я должен получить 24 названия.

Модель

public class Child : BindableBase
{
    public string kind { get; set; }
    public Data2 data { get; set; }
}

public class Data2 : BindableBase
{
    public string title { get; set; }
}

public class Posts : ViewModelBase
{
    public string kind { get; set; }
    public Data data { get; set; }

    internal static Task<Posts> GetFileFromApplicationUriAsync(Uri uri)
    {
        throw new NotImplementedException();
    }
}

View

         <ScrollViewer x:Name="PostsScrollViewer" HorizontalScrollBarVisibility="Hidden" 
                              Height="Auto" Width="Auto">
            <ListView x:Name="PostListBox" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Children}" SelectedItem="{Binding Children}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Children.Data.title}" />
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

        </ScrollViewer>           

ViewModel

ViewModelBase

 public abstract class ViewModelBase : INotifyPropertyChanged
{
    #region Property Changed Event Handler
    public void SetPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion Property Changed Event Handler
}

PostViewModel

    public class PostsViewModel : ViewModelBase
{
    private ObservableCollection<Child> children = new ObservableCollection<Child>();
    private ObservableCollection<Data2> data = new ObservableCollection<Data2>();
    private string title;

    #region Constructor
    public PostsViewModel()
    {
        GetFrontPagePostsAsync();
    }
    #endregion Constructor

    #region Properties
    #region Children
    public ObservableCollection<Child> Children
    {
        get { return this.children; }
        set
        {
            if (value != this.children)
                this.children = value;
            this.SetPropertyChanged("Children");
        }
    }
    #endregion Children
    #endregion Properties
    public async void GetFrontPagePostsAsync()
    {
        using (var client = new HttpClient())
        {
            try
            {
                string content = await client.GetStringAsync("http://www.reddit.com/.json");
                Posts posts = JsonConvert.DeserializeObject<Posts>(content);
                foreach (var i in posts.data.children)
                {
                    children.Add(i);
                }
            }
            catch (Exception e) {
                Console.WriteLine(e); }
        }
    }
}

1 Ответ

1 голос
/ 17 марта 2019

Во-первых, я предполагаю, что ваша коллекция Children не пуста

Тогда, я думаю, ваша проблема в View.Должно быть так:

Вид

<ScrollViewer x:Name="PostsScrollViewer" HorizontalScrollBarVisibility="Hidden" 
                              Height="Auto" Width="Auto">
    <ListView x:Name="PostListBox" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Children}" SelectedItem="{Binding Children}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Data.title}" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>         
</ScrollViewer>           

Что изменилось, так это строка с TextBlock.Родитель TextBlock (ListView) привязан к вашему списку Children .Это означает, что каждый дочерний элемент ListView «знает» объект, который ему нужно визуализировать.В вашем случае TextBlock знает указанные дочерние свойства объекта (в зависимости от положения элемента).Если вы привязываете свою страницу к некоторому виду ViewModel , вам не нужно привязывать каждого ребенка к

<TextBlock Text="{Binding ViewMode.Title}" />

, но вы просто привязываете его к:

<TextBlock Text="{Binding Title}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...