У меня есть 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();
}
}