← Назад

Обновление данных в ListView

Подскажите пожалуйста как правильно использовать GuiAsync(). Есть WPF-приложение с таблицей ListView, которая привязана к переменной aaa. При нажатии на кнопку происходит добавление элемента в переменную ааа. В памяти при отладке я его вижу, но в таблицу он не добавляется. Как правильно обновить таблицу, чтобы в ней появился новый элемент?


        public class aaaClass
        {
            public decimal lastPrice;
            public decimal bestAskPrice;
            public decimal fallPercent;
        }
        public ObservableCollection<aaaClass> aaa = new ObservableCollection<aaaClass>();
...
        private void TestClick(object sender, RoutedEventArgs e)
        {
            var curBond = new aaaClass
            {
                lastPrice = 100m,
                bestAskPrice = 95m,
            };
            aaa.Add(curBond);
            this.GuiAsync(() => aaaGrid.Items.Refresh());
        }


Комментарии (11)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

Support
Support
this.GuiAsync(() => aaa.Add(curBond));
Simen
Simen Автор

Так тоже не работает. Нажимаю на кнопку "Test" и ничего не происходит.

Полный код проекта:

using System.Collections.ObjectModel; using System.Windows; using Ecng.Xaml;

namespace GuiAsyncTest { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public class aaaClass { public decimal lastPrice; public decimal bestAskPrice; }

    public ObservableCollection<aaaClass> aaa = new ObservableCollection<aaaClass>();


    public MainWindow()
    {
        InitializeComponent();
    }

    private void TestClick(object sender, RoutedEventArgs e)
    {
        var curBond = new aaaClass
        {
            lastPrice = 100m,
            bestAskPrice = 95m,
        };

        //aaa.Add(curBond);
        //this.GuiAsync(() => aaaGrid.Items.Refresh());

        this.GuiAsync(() => aaa.Add(curBond));
    }
}

}

Полный код XAML:

<Window x:Class="GuiAsyncTest.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:GuiAsyncTest" mc:Ignorable="d"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Button Name="btnTest" Content="Test" Margin="5" Width="75" Click="TestClick" Height="25"/>

    <ListView Grid.Row="1" ItemsSource="{Binding aaa}" Name="aaaGrid" Margin="5,5,5,5">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="120" Header="BestAsk" DisplayMemberBinding="{Binding bestAskPrice}"/>
                <GridViewColumn Width="150" Header="Последняя цена закрытия" DisplayMemberBinding="{Binding lastPrice}"/>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

</Window>

Прикрепляю архив с проектом на всякий случай

Support
Support

Вы не сделали связку между коллекций и контролом. aaaGrid.ItemsSource

Simen
Simen Автор

Ну вот же связка, если я правильно понимаю:

<ListView Grid.Row="1" ItemsSource="{Binding aaa}" Name="aaaGrid" Margin="5,5,5,5">

Или речь идет о какой-то другой связке?

Support
Support

Simen: Ну вот же связка, если я правильно понимаю:

``` > > Или речь идет о какой-то другой связке?

Попробуйте это сделать в конструкторе окна.

Support
Support

Simen: Ну вот же связка, если я правильно понимаю:

``` > > Или речь идет о какой-то другой связке?

Попробуйте это сделать в конструкторе окна.

Simen
Simen Автор

Я не понимаю, что это значит:

Попробуйте это сделать в конструкторе окна.

А вы в конструкторе сделали связку? У вас заработал пример после этого?

И, может быть, дело не в связке, а в неправильном использовании this.GuiAsync() ?

Support
Support

Я не понимаю, что это значит:

Попробуйте это сделать в конструкторе окна.

Напишите код с инициализацией ItemsSource на C# в конструкторе MainWindow.

Simen
Simen Автор

Спасибо за наводку. Добавил инициализацию так:

        public MainWindow()
        {
            InitializeComponent();
            aaaGrid.ItemsSource = aaa;
        }

Но таблица все равно не обновляется, к сожалению. 😭

Support
Support

Да, дело было в другом. Поменяйте ваш класс на

public class aaaClass
        {
            public decimal lastPrice { get; set; }
            public decimal bestAskPrice { get; set; }
        }
Simen
Simen
Simen Автор

Заработало! Спасибо!