Добавить строки в DataGrid на ButtonClick - PullRequest
0 голосов
/ 29 июня 2018

У меня есть Datagrid, который должен быть списком команд SSH, которые я выполняю. По какой-то причине он не добавляется в список, он просто заменяет содержимое. Вот XAML:

<DataGrid Name="CommandRows2" Margin="0,0,0,87" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridCheckBoxColumn Header="Delete" Binding="{Binding Delete}"/>
        <DataGridTextColumn Header="Command" Binding="{Binding Command}" Width="200"/>
        <DataGridTextColumn Header="Response" Binding="{Binding Response}" Width="*"/>
        <DataGridTextColumn Header="Test Results" Binding="{Binding Results}" Width="70"/>
    </DataGrid.Columns>
</DataGrid>

Вот код:

List<CommandGridItems> items = new List<CommandGridItems>();

private void ExecuteSingleCommand(object sender, RoutedEventArgs e)
{
    string sshCommand = "hostname";
    string returnedResults = "localhost";
    items.Add(new CommandGridItems() { Delete = false, Command = sshCommand, Response = returnedResults, Results = "desc1" });
    CommandRows2.ItemsSource = items;
}

public class CommandGridItems
{
    public bool Delete { get; set; }
    public string Command { get; set; }
    public string Response { get; set; }
    public string Results { get; set; }
}

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

при многократном задании CommandRows2.ItemsSource = items; во втором и последующих назначениях ничего не происходит, поскольку значение (items) не меняется, это одна и та же ссылка.

измените List<CommandGridItems> items = new List<CommandGridItems>(); на ObservableCollection<CommandGridItems> items = new ObservableCollection<CommandGridItems>(); и просто добавьте новые элементы без повторного назначения ItemsSource:

private void ExecuteSingleCommand(object sender, RoutedEventArgs e)
{
    string sshCommand = "hostname";
    string returnedResults = "localhost";
    var element = new CommandGridItems() { Delete = false, Command = sshCommand, Response = returnedResults, Results = "desc1" }
    items.Add(element);
}

Один добавленный элемент будет показан в DataGrid, потому что ObservableCollection уведомляет об изменении элементов через INotifyCollectionChanged событие интерфейса (CollectionChanged), в то время как вызов Refresh в этой ситуации является падением производительности.

INotifyCollectionChanged и INotifyPropertyChanged являются обязательными в WPF для уведомления пользовательского интерфейса об изменениях в ViewModel

0 голосов
/ 29 июня 2018

Обновление списка Items должно сделать это.

CommandRows2.ItemsSource = items;
CommandRows2.Items.Refresh();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...