Как добавлять элемент списка в List?

Хочу при клике на элемент Listwiev ,добавить его в список List ,но не знаю как

  private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {

            List<Tovars> Tovars = new List<Tovars>();
        


       
        }

Ответы (1 шт):

Автор решения: Serge-V

Для начала, как уже было указано в комментариях, код не должен ничего знать о представлении.

Создаем представление. Сделаем простую разметку для тестов и добавим DataContext:

<Window x:Class="ListView.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:ListView"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">

<Window.DataContext>
    <local:MainWindowViewModel></local:MainWindowViewModel>
</Window.DataContext>    

<Grid Background="Lavender">
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
        <StackPanel HorizontalAlignment="Center" Width="500" VerticalAlignment="Center">
            <TextBlock>Исходный ListView</TextBlock>
            <ListView ItemsSource="{Binding SourceList}" SelectedItem="{Binding SelectedIntem}"></ListView>
            <Button Width="300" Height="50" Command="{Binding AddSelectedItemToList}" Margin="10" Cursor="Hand"
                    Content="Добавить выбранный элемент в массив"/>
    </StackPanel>
        <StackPanel Grid.Row="1" HorizontalAlignment="Center" Width="500" VerticalAlignment="Center">
            <TextBlock>Результат добавления выбранного элемента в List</TextBlock>
            <TextBlock Background="White" Text="{Binding ResultStringFromList}" Height="150" ></TextBlock>
    </StackPanel>
</Grid>

Добавляем ViewModel (модель представления)

using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Text;
using ThresholdRelayDesktopApp.Infrastructure.Commands;

namespace ListView
{
    internal class MainWindowViewModel : INotifyPropertyChanged
    {
        StringBuilder _resultStringBuilder = new StringBuilder();
        int _resultItemsCount = 0;

        private List<string> _sourceList = new List<string>() {"first", "second", "third"};

        public List<string> SourceList
        {
            get => _sourceList;
        }

        private List<string> _resultList = new List<string>();

        private string _resultStringFromList = string.Empty;

        public string ResultStringFromList
        {
            get => _resultStringFromList;
            set
            {
                _resultStringFromList = value;
                OnPropertyChanged();
            }
        }

 
        private string _selectedIntem = string.Empty;

        public string SelectedIntem
        {
            get => _selectedIntem;
            set
            {
                _selectedIntem = value;
            }
        }

        private RelayCommand _addSelectedItemToList;

        public RelayCommand AddSelectedItemToList
        {
            get
            {
                return _addSelectedItemToList ??
                    (_addSelectedItemToList = new RelayCommand(obj =>
                    {
                        AddItemToList();
                    }));
            }
        }

        private void AddItemToList()
        {
            _resultList.Add(SelectedIntem);

            _resultStringBuilder.Append(_resultList[_resultItemsCount]);
            _resultStringBuilder.Append("; ");
            ResultStringFromList = _resultStringBuilder.ToString();
            _resultItemsCount++;
        }

        public event PropertyChangedEventHandler? PropertyChanged;

        private void OnPropertyChanged([CallerMemberName] string prop = "") =>
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
    }
}

В представлении в ListView будем выбирать элемент, нажимать кнопку, выбранный элемент добавится в результирующий List. Результирующий List преобразую в строку, для простоты.

Чтобы кнопка работала, добавляем команды

using System;
using System.Windows.Input;

namespace ListView
{
    public abstract class Command : ICommand
    {
        public event EventHandler CanExecuteChanged
        {
            add => CommandManager.RequerySuggested += value;
            remove => CommandManager.RequerySuggested -= value;
        }

        public abstract bool CanExecute(object parameter);

        public abstract void Execute(object parameter);
    }
}

using System;

namespace ListView
{
    public class RelayCommand : Command
    {
        private readonly Action<object> _execute;
        private readonly Func<object, bool> _canExecute;
        public RelayCommand(Action<object> Execute, Func<object, bool> CanExecute = null)
        {
            _execute = Execute ?? throw new ArgumentNullException(nameof(Execute));
            _canExecute = CanExecute;

        }
        public override bool CanExecute(object parameter) => _canExecute?.Invoke(parameter) ?? true;

        public override void Execute(object parameter) => _execute(parameter);
    }
}

Чтобы представление обновляло результирующую строку, реализован интерфейс INotifyPropertyChanged.

Если нужны пояснения, пишите в комментариях

→ Ссылка