我似乎无法清除数据绑定的WPF ListBox的SelectedItems集合。我试过调用ListBox.SelectedItems.Clear(),我尝试将SelectedIndex设置为-1,将SelectedItem设置为null并调用ListBox.UnselectAll()。在调试时,似乎分配没有采取或某些东西正在重置SelectedItems集合,但我不知道是什么。我在SelectionChanged回调中放置了一个断点,它永远不会被意外命中,但是SelectedItems.Count成员总是至少为1(有时大于1,因为这个ListBox的选择模式是MultiExtended)。
有没有人见过这个,知道我做错了什么?这个问题看起来与这个问题完全相同: WPF - How to clear selection from ListView?
除了那篇文章,Sonny Boy正在使用ListView,而我正在使用ListBox。在任何情况下,投票的答案是调用ListView.UnselectAll(),这在我的情况下不起作用。
我觉得我必须做一些非常明显错误的事情,因为清理选择应该非常简单。
注意:为了清楚起见,我不想从ListBox中删除选择,我只是不想选择任何内容。
谢谢!
<ListBox Background="{StaticResource ResourceKey=DarkGray}" Name="lbx_subimageThumbnails" Margin="6,6,6,0" ItemsSource="{Binding ElementName=lbx_thumbnails, Path=SelectedItem.Swatches}" Style="{StaticResource WPTemplate}" SelectionMode="Extended" Height="{Binding ElementName=sld_swatchRows, Path=Value}" VerticalAlignment="Top" SelectionChanged="lbx_subimageThumbnails_SelectionChanged" DataContext="{Binding}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel HorizontalAlignment="Stretch" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Visibility" Value="{Binding Path=Vis}" />
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Width="270" Height="270" Margin="5,5,5,5" Tag="{Binding}" Name="lbx_swatchThumbnail" Background="{StaticResource ResourceKey=LightGray}" PreviewMouseLeftButtonDown="lbx_swatchThumbnail_PreviewMouseLeftButtonDown" PreviewMouseMove="lbx_swatchThumbnail_PreviewMouseMove">
<Grid.LayoutTransform>
<ScaleTransform CenterX="0" CenterY="0" ScaleX="0.50" ScaleY="0.50" />
</Grid.LayoutTransform>
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Header="Sync selected" Click="btn_syncSwatch_Click" />
<MenuItem Header="Re-export selected" Click="btn_exportSelected_Click"/>
<MenuItem Header="Set as default thumbnail" Click="btn_setThumbnail_Click"/>
<MenuItem Header="Delete selected" Click="btn_deleteSwatch_Click"/>
<MenuItem Header="Show in Explorer" Click="mnu_showSwatchesInExplorer_Click" />
<MenuItem Header="Create Frames" Click="mnu_createFrames_Click" ToolTip="Creates FRAMEs groups to your PSD file under the Group associated with the selected swatch. DO NOT RE-ORDER OR RENAME THE GENERATED groups!" />
<MenuItem Header="Create MIPs" Click="mnu_createMIPs_Click" ToolTip="Creates MIPs groups to your PSD file under the Group associated with the selected swatch. DO NOT RE-ORDER OR RENAME THE GENERATED groups!" />
</ContextMenu>
</Grid.ContextMenu>
<Border BorderBrush="Black" BorderThickness="1">
<Grid ToolTip="{Binding Path=Texture}">
<Image VerticalAlignment="Center" HorizontalAlignment="Center" PhotoLoader:Loader.DisplayOption="Preview" PhotoLoader:Loader.DisplayWaitingAnimationDuringLoading="True" PhotoLoader:Loader.Source="{Binding Path=Texture}" PhotoLoader:Loader.DisplayErrorThumbnailOnError="True" Width="256" Height="256" />
<TextBlock VerticalAlignment="Top" HorizontalAlignment="Center" Margin="0,10,0,0" FontSize="20" Text="{Binding Path=Group}" Background="Black" Foreground="White"/>
<TextBlock VerticalAlignment="Bottom" HorizontalAlignment="Center" Background="Black" Margin="0,0,0,10" FontSize="20" Foreground="White">
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} x {1} {2}" >
<Binding Path="Width" />
<Binding Path="Height" />
<Binding Path="Format" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Grid>
</Border>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
// this callback kicks everything off.
private void btn_editSwatch_Click(object sender, RoutedEventArgs e)
{
// get a list of the selected indices - we will have to unselect the texture source and reselect it after the re-export in order to force the thumbnail display to update
// so we will save a list of indices to reselect them after the export
List selectedIndices = new List();
for (int i = 0; i < lbx_subimageThumbnails.Items.Count; i++)
{
if (lbx_subimageThumbnails.SelectedItems.Contains(lbx_subimageThumbnails.Items[i]))
{
selectedIndices.Add(i);
}
}
// store the index of the selected texture source to reselect it after the re-export
int selIndex = lbx_thumbnails.SelectedIndex;
// edit and re-export the selected thumbnails
if (this.EditThumbnails(lbx_subimageThumbnails.SelectedItems, lbx_thumbnails.SelectedItem))
{
// re-select the texture source
lbx_thumbnails.SelectedIndex = selIndex;
// re-select the previously selected thumbnails.
foreach (int index in selectedIndices)
{
if (!lbx_subimageThumbnails.SelectedItems.Contains(lbx_subimageThumbnails.Items[index]))
{
lbx_subimageThumbnails.SelectedItems.Add(lbx_subimageThumbnails.Items[index]);
}
}
}
}
private void lbx_subimageThumbnails_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListBox textureSelector = sender as ListBox;
if (textureSelector != null)
{
//update some UI elements
}
}
/*
this is the SelectionChanged callback for another listbox which is bound as the ItemSource of lbx_subimageThumbnails. When the selection here changes, we default the selection of the subimage listbox to the first subimage after first clearing the selected items in the subimage listbox
*/
private void lbx_thumbnails_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
// clear the previous swatch selection and select the first thumbnail
// None of these methods works. after each, lbx_subimageThumbnails.SelectedItems.Count is still >= 1
// Also, trying to set the SelectedIndex doesn't take. After the assignment, debugger shows
// SelectedIndex is still 0
lbx_subimageThumbnails.SelectedIndex = -1;
lbx_subimageThumbnails.SelectedIndex = -1;
// Trying to set SelectedItem to null doesn't work...after assignment, SelectedItem is still a vaild
// reference
this.lbx_subimageThumbnails.SelectedItem = null;
if (lbx_subimageThumbnails.SelectedItems.Count > 0)
{
lbx_subimageThumbnails.UnselectAll();
lbx_subimageThumbnails.SelectedItems.Clear();
}
lbx_subimageThumbnails.SelectedIndex = 0;
// reset the preview pane size
sld_previewSize.Value = 1.0;
}
答案 0 :(得分:6)
您是否覆盖了ListBox中的项目Equals()
和GetHashCode()
?我可以通过以下方式复制这个:
第一项不会从SelectedItems
中删除,也无法以您描述的方式手动删除。即使SelectionMode
是单一的,也是如此,如果您重新选择第一个项目,将导致抛出异常。