0

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

  private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
        List<Tovars> Tovars = new List<Tovars>();




    }

  • Забудьте про обработчики в WPF проекте, научитесь использовать его самые базовые вещи, а именно привязки! У вас должна быть простая структура классов, со своими данными, к которым уже привязывается UI (XAML), который уже сам, на основе данных, создает нужный вид. Вот когда вы это поймете, научитесь, тогда у вас все пойдет как по маслу, ну а сейчас вы придумываете себе костыли, которые может быть актуальны для WinForms, но не для WPF. События в WPF заменяются командами (ICommand), а также в помощь SelectrdItem и прочие свойства, которые вам дают сразу нужный объект. – EvgeniyZ Sep 29 '22 at 19:03
  • Bilding я и использую , его знаю – Ученик Sep 29 '22 at 19:04
  • Если используете события, то нет, не знаете, ибо привязки 90% обычных задач решат. А так, я не вижу ваш код, не вижу XAML, привязок, и чего либо еще, поэтому сутить тут уж не буду что у вас там. – EvgeniyZ Sep 29 '22 at 19:23
  • list.Add(item); – aepot Sep 29 '22 at 19:44

1 Answers1

1

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

Создаем представление. Сделаем простую разметку для тестов и добавим 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&lt;string&gt; _sourceList = new List&lt;string&gt;() {&quot;first&quot;, &quot;second&quot;, &quot;third&quot;};

    public List&lt;string&gt; SourceList
    {
        get =&gt; _sourceList;
    }

    private List&lt;string&gt; _resultList = new List&lt;string&gt;();

    private string _resultStringFromList = string.Empty;

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


    private string _selectedIntem = string.Empty;

    public string SelectedIntem
    {
        get =&gt; _selectedIntem;
        set
        {
            _selectedIntem = value;
        }
    }

    private RelayCommand _addSelectedItemToList;

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

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

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

    public event PropertyChangedEventHandler? PropertyChanged;

    private void OnPropertyChanged([CallerMemberName] string prop = &quot;&quot;) =&gt;
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) =&gt; _canExecute?.Invoke(parameter) ?? true;

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

}

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

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

Serge-V
  • 142
  • 2
    <Window.DataContext> - плохо, и, по сути, нарушение MVVM. А так, ответ хороший, но есть одно НО, я не думаю, что автор хочет MVVM, тут стоило бы упросить до простого WPF с простыми привязками, без всяких слоев MVVM и их терминов, даже фиг с ними, ICommand в виде простых Click событий. А такой ответ увы, скорей всего отпугнет новичка) – EvgeniyZ Sep 29 '22 at 22:06
  • 1
    Хороший ответ. RelayCommand только есть попроще, без лишних абстракций. Ещё namespace ListView название может конфликтовать с классом ListView. – aepot Sep 30 '22 at 05:58
  • Спасибо за комментарии! Было познавательно :) – Serge-V Sep 30 '22 at 15:57
  • Спасибо за подробное обьяснение! – Ученик Sep 30 '22 at 16:27