清除其他 ListView 选择
Clearing other ListView Selection
如何正确清除其他ListView中的selection?例如我有 4 个列表视图堆叠,如果我在 listView1 中有一个 selection,那么我在 listView2 中 select 一个新项目,我希望 listView1 中的 selection 消失并且 listview2 中的项目已正确 selected。注意:列表视图是单个 selection.
<StackPanel>
<ListView x:Name="listView1" />
<ListView x:Name="listView2" />
<ListView x:Name="listView3" />
<ListView x:Name="listView4" />
</StackPanel>
我第一次尝试:
<StackPanel>
<ListView x:Name="listView1" SelectionChanged="selectionchanged1" />
<ListView x:Name="listView2" SelectionChanged="selectionchanged2" />
<ListView x:Name="listView3" SelectionChanged="selectionchanged3" />
<ListView x:Name="listView4" SelectionChanged="selectionchanged4" />
</StackPanel>
隐藏代码:
private void selectionChanged1(object sender, SelectionChangedEventArgs e)
{
listView2.SelectedItem = null;
listView3.SelectedItem = null;
listView4.SelectedItem = null;
}
private void selectionChanged2(object sender, SelectionChangedEventArgs e)
{
listView1.SelectedItem = null;
listView3.SelectedItem = null;
listView4.SelectedItem = null;
}
...
我遇到的问题是在 listView1 中有一个 selection 并单击 listView2 中的一个项目后,listView1 中的 selection 被清除,但 listView2 中的项目不是 selected.
原因是(至少)触发了 2 个事件:
- selectionchanged2 被触发,在列表视图 1,3,4
中清除 selections
- 因为我正在清除 listview1 中的 selection,selectionchanged1 也被触发,它清除了 listview 2,3,4
中的 selections
- 我认为 selectionchanged2 又被触发了。
- 因此我最终在任何列表中都没有 selection。
你有更好的建议吗?
也许试试这个:Link它们全部交给同一个处理程序,例如:
<StackPanel>
<ListView x:Name="listView1" SelectionChanged="selectionchanged" />
<ListView x:Name="listView2" SelectionChanged="selectionchanged" />
<ListView x:Name="listView3" SelectionChanged="selectionchanged" />
<ListView x:Name="listView4" SelectionChanged="selectionchanged" />
</StackPanel>
然后:
private void selectionChanged(object sender, SelectionChangedEventArgs e)
{
string listViewName = ((ListView)sender).Name;
if (listViewName == "listView1")
{
listView2.SelectedItem = null;
listView3.SelectedItem = null;
listView4.SelectedItem = null;
}
else if (listViewName == "listView3")
{
listView1.SelectedItem = null;
listView2.SelectedItem = null;
listView4.SelectedItem = null;
}
else if (listViewName == "listView4")
{
listView1.SelectedItem = null;
listView2.SelectedItem = null;
listView3.SelectedItem = null;
}
else if (listViewName == "listView2")
{
listView1.SelectedItem = null;
listView3.SelectedItem = null;
listView4.SelectedItem = null;
}
}
它又乱又长(未经测试),但如果它有效,请告诉我。
您可以在清除其他字段之前添加空检查,例如
对于 listView1:
private void selectionChanged1(object sender, SelectionChangedEventArgs e)
{
if(listView1.SelectedItem == null)
{
listView2.SelectedItem = null;
listView3.SelectedItem = null;
listView4.SelectedItem = null;
}
}
同样可以给别人改。
我认为您可以尝试将此 SelectionChanged 事件用于所有 ListViews:
private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count != 0)
{
if (listView1 != sender as ListView) listView1.SelectedItem = null;
if (listView2 != sender as ListView) listView2.SelectedItem = null;
if (listView3 != sender as ListView) listView3.SelectedItem = null;
if (listView4 != sender as ListView) listView4.SelectedItem = null;
}
}
它只是检查 ListView 中是否有新设置,如果有,则清除所有其他 ListViews.
当您将 ListView 的 SelectedItem 设置为 null 时,SelectionChanged 事件将再次触发,因为 ListView 的 SelectedItem 已更改,因此您可以使用标志跳过第二次 SelectionChanged even 调用。
检查下面的代码片段。希望对您有所帮助。
XAML
<Window x:Class="ListView.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ListView"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel x:Name="MyStackPanel">
<ListView x:Name="listView1" SelectionChanged="listView1_SelectionChanged" SelectionMode="Single">
<ListViewItem>Item 1</ListViewItem>
<ListViewItem>Item 2</ListViewItem>
</ListView>
<ListView x:Name="listView2" SelectionChanged="listView1_SelectionChanged" SelectionMode="Single">
<ListViewItem>Item 3</ListViewItem>
<ListViewItem>Item 4</ListViewItem>
</ListView>
<ListView x:Name="listView3" SelectionChanged="listView1_SelectionChanged" SelectionMode="Single">
<ListViewItem>Item 5</ListViewItem>
<ListViewItem>Item 6</ListViewItem>
</ListView>
<ListView x:Name="listView4" SelectionChanged="listView1_SelectionChanged" SelectionMode="Single">
<ListViewItem>Item 7</ListViewItem>
<ListViewItem>Item 8</ListViewItem>
</ListView>
</StackPanel>
</Grid>
</Window>
代码隐藏
namespace ListView
{
using System.Windows;
using System.Windows.Controls;
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private bool skipSelectionChanged;
public MainWindow()
{
InitializeComponent();
}
private void listView1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (skipSelectionChanged)
{
skipSelectionChanged = false;
return;
}
var listView = sender as ListView;
if (listView != null)
{
var name = listView.Name;
for (int i = 0; i < MyStackPanel.Children.Count; i++)
{
var child = MyStackPanel.Children[i] as ListView;
if (child.Name != name && child.SelectedItem != null)
{
skipSelectionChanged = true;
child.SelectedItem = null;
}
}
}
}
}
}
如何正确清除其他ListView中的selection?例如我有 4 个列表视图堆叠,如果我在 listView1 中有一个 selection,那么我在 listView2 中 select 一个新项目,我希望 listView1 中的 selection 消失并且 listview2 中的项目已正确 selected。注意:列表视图是单个 selection.
<StackPanel>
<ListView x:Name="listView1" />
<ListView x:Name="listView2" />
<ListView x:Name="listView3" />
<ListView x:Name="listView4" />
</StackPanel>
我第一次尝试:
<StackPanel>
<ListView x:Name="listView1" SelectionChanged="selectionchanged1" />
<ListView x:Name="listView2" SelectionChanged="selectionchanged2" />
<ListView x:Name="listView3" SelectionChanged="selectionchanged3" />
<ListView x:Name="listView4" SelectionChanged="selectionchanged4" />
</StackPanel>
隐藏代码:
private void selectionChanged1(object sender, SelectionChangedEventArgs e)
{
listView2.SelectedItem = null;
listView3.SelectedItem = null;
listView4.SelectedItem = null;
}
private void selectionChanged2(object sender, SelectionChangedEventArgs e)
{
listView1.SelectedItem = null;
listView3.SelectedItem = null;
listView4.SelectedItem = null;
}
...
我遇到的问题是在 listView1 中有一个 selection 并单击 listView2 中的一个项目后,listView1 中的 selection 被清除,但 listView2 中的项目不是 selected.
原因是(至少)触发了 2 个事件:
- selectionchanged2 被触发,在列表视图 1,3,4 中清除 selections
- 因为我正在清除 listview1 中的 selection,selectionchanged1 也被触发,它清除了 listview 2,3,4 中的 selections
- 我认为 selectionchanged2 又被触发了。
- 因此我最终在任何列表中都没有 selection。
你有更好的建议吗?
也许试试这个:Link它们全部交给同一个处理程序,例如:
<StackPanel>
<ListView x:Name="listView1" SelectionChanged="selectionchanged" />
<ListView x:Name="listView2" SelectionChanged="selectionchanged" />
<ListView x:Name="listView3" SelectionChanged="selectionchanged" />
<ListView x:Name="listView4" SelectionChanged="selectionchanged" />
</StackPanel>
然后:
private void selectionChanged(object sender, SelectionChangedEventArgs e)
{
string listViewName = ((ListView)sender).Name;
if (listViewName == "listView1")
{
listView2.SelectedItem = null;
listView3.SelectedItem = null;
listView4.SelectedItem = null;
}
else if (listViewName == "listView3")
{
listView1.SelectedItem = null;
listView2.SelectedItem = null;
listView4.SelectedItem = null;
}
else if (listViewName == "listView4")
{
listView1.SelectedItem = null;
listView2.SelectedItem = null;
listView3.SelectedItem = null;
}
else if (listViewName == "listView2")
{
listView1.SelectedItem = null;
listView3.SelectedItem = null;
listView4.SelectedItem = null;
}
}
它又乱又长(未经测试),但如果它有效,请告诉我。
您可以在清除其他字段之前添加空检查,例如
对于 listView1:
private void selectionChanged1(object sender, SelectionChangedEventArgs e)
{
if(listView1.SelectedItem == null)
{
listView2.SelectedItem = null;
listView3.SelectedItem = null;
listView4.SelectedItem = null;
}
}
同样可以给别人改。
我认为您可以尝试将此 SelectionChanged 事件用于所有 ListViews:
private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count != 0)
{
if (listView1 != sender as ListView) listView1.SelectedItem = null;
if (listView2 != sender as ListView) listView2.SelectedItem = null;
if (listView3 != sender as ListView) listView3.SelectedItem = null;
if (listView4 != sender as ListView) listView4.SelectedItem = null;
}
}
它只是检查 ListView 中是否有新设置,如果有,则清除所有其他 ListViews.
当您将 ListView 的 SelectedItem 设置为 null 时,SelectionChanged 事件将再次触发,因为 ListView 的 SelectedItem 已更改,因此您可以使用标志跳过第二次 SelectionChanged even 调用。
检查下面的代码片段。希望对您有所帮助。
XAML
<Window x:Class="ListView.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ListView"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel x:Name="MyStackPanel">
<ListView x:Name="listView1" SelectionChanged="listView1_SelectionChanged" SelectionMode="Single">
<ListViewItem>Item 1</ListViewItem>
<ListViewItem>Item 2</ListViewItem>
</ListView>
<ListView x:Name="listView2" SelectionChanged="listView1_SelectionChanged" SelectionMode="Single">
<ListViewItem>Item 3</ListViewItem>
<ListViewItem>Item 4</ListViewItem>
</ListView>
<ListView x:Name="listView3" SelectionChanged="listView1_SelectionChanged" SelectionMode="Single">
<ListViewItem>Item 5</ListViewItem>
<ListViewItem>Item 6</ListViewItem>
</ListView>
<ListView x:Name="listView4" SelectionChanged="listView1_SelectionChanged" SelectionMode="Single">
<ListViewItem>Item 7</ListViewItem>
<ListViewItem>Item 8</ListViewItem>
</ListView>
</StackPanel>
</Grid>
</Window>
代码隐藏
namespace ListView
{
using System.Windows;
using System.Windows.Controls;
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private bool skipSelectionChanged;
public MainWindow()
{
InitializeComponent();
}
private void listView1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (skipSelectionChanged)
{
skipSelectionChanged = false;
return;
}
var listView = sender as ListView;
if (listView != null)
{
var name = listView.Name;
for (int i = 0; i < MyStackPanel.Children.Count; i++)
{
var child = MyStackPanel.Children[i] as ListView;
if (child.Name != name && child.SelectedItem != null)
{
skipSelectionChanged = true;
child.SelectedItem = null;
}
}
}
}
}
}