我有一个带有特定ItemTemplate的ListView,它可视地显示对象列表的内容。我希望允许用户通过单击选择这样的对象,并且选择它后,它将作为应用程序的当前对象加载并从列表中删除。
问题是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();
}
}
答案 0 :(得分:1)
我把它放在一个答案中,因此它从那里的评论墙中脱颖而出。
由于您要删除selectionchanged,因此无论何时更改,您都要删除。尝试在PreviewMouseUp中使用删除逻辑,然后在那里抓取项目。这样,点击某些内容就不会删除该项目,直到您点击完成为止。
希望这会有所帮助。
答案 1 :(得分:0)
您应该尝试避免代码,并采用MVVM design pattern。在这种情况下,您将绑定SelectedItem
的{{1}}(虽然没有理由这不是ListView
),然后只删除ListBox
在您的视图模型中从集合中响应其值的变化。
答案 2 :(得分: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;
}
}