C# не может привязаться к представлению списка с помощью наблюдаемой коллекции

#c# #wpf #data-binding #observable

Вопрос:

У меня возникает проблема, когда я пытаюсь привязать коллекцию типа observable к ListView. Я уверен, что коллекция обновляется правильно, но в представлении списка ничего не происходит.

Я извлекаю объекты JSON и преобразую их в коллекцию наблюдаемых.

 public partial class MainWindow : Window
{
    public ObservableCollection<post> mproducts = new ObservableCollection<post>();

    public MainWindow()
    {

        InitializeComponent();
        DataContext = mproducts;
    }
    private static readonly HttpClient Client = new HttpClient();
    async void OnLoad(object sender, RoutedEventArgs e)
    {
        HttpResponseMessage response = await Client.GetAsync("https://jsonplaceholder.typicode.com/posts");
        response.EnsureSuccessStatusCode();
        string data = await response.Content.ReadAsStringAsync();

        mproducts = JsonConvert.DeserializeObject<ObservableCollection<post>>(data);
        MessageBox.Show(mproducts.Count.ToString());

    }
    public class post
    {
        public string UserId { get; set; }
        public string Id { get; set; }
        public string Title { get; set; }
        public string Body { get; set; }
    }
 

}

это класс XAML:

 <Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Loaded="OnLoad"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
    
        <ListView x:Name="products" Margin="400,0,0,0" Width="600" SelectionChanged="ListView_SelectionChanged" ItemsSource="{Binding mproducts}"; >
           
           
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="160" Header="Description" DisplayMemberBinding="{Binding UserId}"/>
                    <GridViewColumn Width="160" Header="Date Filed" DisplayMemberBinding="{Binding Id}"/>
                    <GridViewColumn Width="160" Header="Filed By" DisplayMemberBinding="{Binding Title}"/>
                    <GridViewColumn Width="150" Header="Page" DisplayMemberBinding="{Binding Body}"/>
                    <GridViewColumn Width="Auto" Header="" />
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>


</Window>
 

когда приложение загружается, в окне сообщения отображается номер 100, что означает, что коллекция обновлена.

Комментарии:

1. Каковы типы DataContext и mproducts?

2. @ChetanRanpariya, я не добавлял DataContext, тип mproducts — «Наблюдаемая коллекция<post>»

3. Вы не должны изменять свой текст данных. Но лучше используйте методы добавления/удаления наблюдаемой коллекции.

Ответ №1:

Привязка ListBox должна выглядеть так

 ItemsSource="{Binding}"
 

потому что вы привязываетесь к самой коллекции, которая хранится в DataContext . Также в вашем коде вы должны сделать DataContext = mproducts; это в OnLoad случае, если после того, как вы назначите коллекцию mproducts , как это:

 mproducts = JsonConvert.DeserializeObject<ObservableCollection<post>>(data);
DataContext = mproducts;
 

Комментарии:

1. спасибо, это очень помогло, должен ли я добавлять «DataContext = mproducts;» каждый раз, когда я обновляю представление списка?

2. только если вы создадите новый список, но не добавите элементы в существующий список