Удаление ListView только по клику - PullRequest
0 голосов
/ 19 октября 2011

У меня есть ListView с конкретным ItemTemplate, который визуально отображает содержимое списка объектов. Я хотел, чтобы пользователь мог выбрать такой объект, щелкнув по нему, и в результате этого он будет загружен как текущий объект приложения и удален из списка.

Проблема в том, что просмотр списка не поддерживает события Click, поэтому я попытался использовать событие SelectionChanged. Ну, это тоже не нормально, потому что, если я нажимаю на элемент (но не отпуская мышь), а затем перемещаю мышь над другим элементом (удерживая мышь нажатой), он также удаляет этот элемент.

Есть предложения о том, как удалить выбранный элемент из списка, не вызывая дополнительных операций? Вот упрощенная версия моего кода (с таким же поведением):

<Window x:Class="ListViewIssue.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition Height="50"></RowDefinition>
        </Grid.RowDefinitions>
        <ListView x:Name="lstNumbers"  SelectionMode="Single"  ScrollViewer.HorizontalScrollBarVisibility="Disabled" SelectionChanged="lstNumbers_SelectionChanged">
            <ListView.ItemTemplate>                
                <DataTemplate>
                    <Grid Width="170" Background="Transparent">                        
                        <TextBlock HorizontalAlignment="Left" Text="{Binding val, Mode=TwoWay}" TextWrapping="Wrap" Margin="3"/>
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        <Button Name="btnAddItem" Grid.Row="1" Click="btnAddItem_Click">Add Item</Button>
    </Grid>
</Window>

и код:

public partial class MainWindow : Window
    {
        public class valueClass
        {
            public int val { get; set; }
        }
        private List<valueClass> list;
        private int counter;

        public MainWindow()
        {
            InitializeComponent();
            CreateList();
            DisplayList();
        }

        private void CreateList()
        {
            list = new List<valueClass>();
            counter = 8;
            for (int i = 0; i < counter; i++)
            {
                list.Add(new valueClass() { val = i + 1 });
            }
        }

        private void lstNumbers_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (lstNumbers.SelectedIndex != -1)
            {
                list.Remove(lstNumbers.SelectedValue as valueClass);
                DisplayList();
            }
        }

        private void DisplayList()
        {
            this.lstNumbers.ItemsSource = null;
            this.lstNumbers.ItemsSource = list;
        }

        private void btnAddItem_Click(object sender, RoutedEventArgs e)
        {
            list.Add(new valueClass() { val = counter++ + 1 });
            DisplayList();
        }
    }

Ответы [ 3 ]

1 голос
/ 19 октября 2011

Я поместил это в ответ, чтобы оно выделялось на стене комментария.

Поскольку вы удаляете по выделенному, в любое время, которое изменяется, вы удаляете.Попробуйте использовать логику удаления в PreviewMouseUp и затем захватить элемент там.Таким образом, нажатие на что-либо не удалит элемент, пока вы не закончите.

Надеюсь, это поможет.

0 голосов
/ 24 сентября 2017

Мое решение

private void lstNumbers_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (lstNumbers.SelectedIndex != -1)
            { 
                lstNumbers.SelectionChanged-=lstNumbers_SelectionChanged;
                list.Remove(lstNumbers.SelectedValue as valueClass);
                DisplayList();
                lstNumbers.SelectionChanged+=lstNumbers_SelectionChanged;
            }
        }
0 голосов
/ 19 октября 2011

Вы должны попытаться избежать кода и принять шаблон проектирования MVVM .В этом случае вы должны связать SelectedItem из ListView (хотя нет причин, по которым это не может быть ListBox), а затем просто удалить SelectedItem в вашей модели представления из коллекцииответ на изменение его значения.

...