Обновление данных в ListView (C#/WPF)

182
05 сентября 2018, 10:00

Есть ListView в который записывается данные, дело в том что нету возможности записать все сразу, по этому необходимо изменять/обновлять данные которые уже были внесены в ListView. Как это лучше всего сделать?

<ListView x:Name="ClientsInfo">
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding Path=ConnectionID}">ID</GridViewColumn>
            <GridViewColumn DisplayMemberBinding="{Binding Path=ClientName}">Name</GridViewColumn>
            <GridViewColumn DisplayMemberBinding="{Binding Path=Version}">Version</GridViewColumn>
            <GridViewColumn DisplayMemberBinding="{Binding Path=ComputerID}">Computer ID</GridViewColumn>
            <GridViewColumn DisplayMemberBinding="{Binding Path=ClientIP}">Client IP</GridViewColumn>
            <GridViewColumn DisplayMemberBinding="{Binding Path=PingTime}">Ping Time</GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

public class ClientsInfo
{
    public string ConnectionID { get; set; }
    public string ClientName { get; set; }
    public string Version { get; set; }
    public string ComputerID { get; set; }
    public string ClientIP { get; set; }
    public string PingTime { get; set; }
}
ClientsInfo.Items.Add(new ClientsInfo
{
    ConnectionID = clientNumber.ToString(),
    ClientName = "Receiving...",
    Version = "Receiving...",
    ComputerID = "Receiving...",
    ClientIP = clientIP,
    PingTime = "..."
});
ClientsInfo.Items.Refresh();
...
ClientsInfo.Items.Add(new ClientsInfo
{
    ClientName = clientsName,
    Version = versionStr,
    ComputerID = computerName,
});
ClientsInfo.Items.Refresh();
...
ClientsInfo.Items.Add(new ClientsInfo
{
    PingTime = $"{elapsedTimeInMilliseconds:0.##}ms"
});
ClientsInfo.Items.Refresh();
Answer 1

Пример. Сущность:

public class User : INotifyPropertyChanged
{
    private string name;
    public string Name
    {
        get => name;
        set
        {
            name = value;
            // Уведомляем об изменении свойства
            NotifyPropertyChanged();
        }
    }
    private int age;
    public int Age
    {
        get => age;
        set { age = value; NotifyPropertyChanged(); }
    }
    #region Реализация INPC — обычно выносится в отдельный базовый класс
    private void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion
}

Окно:

public partial class MainWindow : Window
{
    private ObservableCollection<User> users = new ObservableCollection<User>();
    public MainWindow()
    {
        InitializeComponent();
        myListView.ItemsSource = users;
    }
    private void Button1_Click(object sender, RoutedEventArgs e)
    {
        users.Add(new User { Name = "Василий", Age = 25 });
    }
    private void Button2_Click(object sender, RoutedEventArgs e)
    {
        users.Add(new User { Name = "Петр", Age = 37 });
    }
    private void Button3_Click(object sender, RoutedEventArgs e)
    {
        users[1].Name = "Иван";
    }
    private void Button4_Click(object sender, RoutedEventArgs e)
    {
        users.RemoveAt(0);
    }
}

Разметка окна:

<Grid Margin="5">
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <ListView Name="myListView">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Имя" DisplayMemberBinding="{Binding Name}"/>
                <GridViewColumn Header="Возраст" DisplayMemberBinding="{Binding Age}"/>
            </GridView>
        </ListView.View>
    </ListView>
    <UniformGrid Grid.Row="1" Rows="1" Margin="0,5,0,0">
        <UniformGrid.Resources>
            <Style TargetType="Button">
                <Setter Property="Margin" Value="2.5,0"/>
            </Style>
        </UniformGrid.Resources>
        <Button Content="1" Click="Button1_Click"/>
        <Button Content="2" Click="Button2_Click"/>
        <Button Content="3" Click="Button3_Click"/>
        <Button Content="4" Click="Button4_Click"/>
    </UniformGrid>
</Grid>

Как видно по коду, мы работаем только со строготипизированной коллекцией users, все изменения в GUI подхватываются автоматически.

Следующий шаг — разделение GUI и логики приложения. Все действия описываем в виде команд, все данные помещаем в отдельные классы (а не как сейчас коллекция в классе окна). Ну и апогей этого подхода — шаблон MVVM.

READ ALSO
как при наведении курсора на кнопку сделать появления справки Windows forms

как при наведении курсора на кнопку сделать появления справки Windows forms

Будет кнопка, и если удержать на этой кнопке мышку секунду где-то 05 будет появляться окно с текстом

173
Реализация протокола WebSocket на C#

Реализация протокола WebSocket на C#

На GitHub есть репозиторий с реализацией декодирования фреймов протокола WebSocketПроблема в том, что если в один момент времени отправляется много...

206
laravel авторизация роли и прав

laravel авторизация роли и прав

я составляю cms на laravel c возможность расширяться через плагиныВозник вопрос, у меня есть пользователи и каждому можно задавать роли админ...

191
American Express Api для интернет магазина

American Express Api для интернет магазина

Подскажите где взять номальную документацию по роботе с АПИ для оплаты по American Express? И существует ли оно вообще? Или это АПИ закрытое? Можете...

197