0

我有一个带有特定 ItemTemplate 的 ListView,它直观地显示对象列表的内容。我想让用户通过单击它来选择这样的对象,并且作为选择它的结果,它将作为应用程序的当前对象加载并从列表中删除。

问题是列表视图不支持 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();
        }
    }
4

3 回答 3

1

我把它放在一个答案中,所以它从那里的评论墙上脱颖而出。

由于您在 selectionchanged 上删除,因此只要发生更改,您就会删除。尝试在 PreviewMouseUp 中使用您的删除逻辑,然后在那里抓取该项目。这样,在单击完成之前,单击某些内容不会删除该项目。

希望这可以帮助。

于 2011-10-19T13:09:21.987 回答
0

您应该尽量避免代码落后,并采用MVVM 设计模式。在这种情况下,您将绑定 的SelectedItemListView尽管没有理由不能ListBox代替),然后只需SelectedItem从集合中删除视图模型中的 以响应其值的更改。

于 2011-10-19T13:07:43.930 回答
0

我的解决方案

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;
            }
        }
于 2017-09-24T10:21:04.987 回答