当更改ListBox中的选定项目时,我收到一个奇怪的错误,其中更改的项目显示为已选中,但我无法取消选择它或重新选择它。
有没有办法解决这个问题?
这是一个演示此问题的示例应用。
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
this.DataContext = new WindowViewModel();
lst.SelectedIndex = 0;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
((WindowViewModel)this.DataContext).Items[0] = "New Item";
}
}
public class WindowViewModel
{
public WindowViewModel()
{
Items = new ObservableCollection<string>();
Items.Add("Item1");
Items.Add("Item2");
Items.Add("Item3");
}
public ObservableCollection<string> Items { get; set; }
}
<Window x:Class="WpfSelectionIssue.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel>
<Button Content="Change" Click="Button_Click" />
<ListBox x:Name="lst" ItemsSource="{Binding Items}" />
</StackPanel>
</Window>
ImageOfIssue http://img136.imageshack.us/img136/9396/wpfselectionissue.jpg
答案 0 :(得分:4)
在搜索了一下后,我找到了解决方案。将一个IsSynchronizedWithCurrentItem添加到ListBox解决了这个问题。
<ListBox
x:Name="lst"
ItemsSource="{Binding Items}"
IsSynchronizedWithCurrentItem="True"
/>
答案 1 :(得分:1)
我也有这个问题,我无法取消选择任何项目。当列表中有多个项目完全相同时,列表框似乎无法理解。 (因此它会全部选择它们,但不会取消选择它们)
当您在绑定时更改所选项目的值时,也会发生这种情况。您必须先取消选择索引(例如:listBox.SelectedIndex = -1;),然后更改该值。
我希望这可以帮助任何与我有同样问题的人。
答案 2 :(得分:0)
虽然这不是一个好的答案,但我个人对此并不满意,所以我去找了另一个。
如果您正在更改的项目当前已被选中并且您直接绑定到源,则会出现这种情况。
在CollectViewSource
和您的视图模型之间使用ListBox
。
<Window x:Class="TestApplication.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<CollectionViewSource x:Key="ViewSource" Source="{Binding Items}" />
</Window.Resources>
<StackPanel>
<Button Content="Change" Click="Button_Click" />
<ListBox x:Name="lst" ItemsSource="{Binding Source={StaticResource ViewSource}}" />
</StackPanel>
</Window>
无法解释您的示例中发生了什么,可能是WPF的错误,但这是一个更好/更清洁的解决方案。我怀疑IsSynchronizedWithCurrentItem="True"
正在幕后为您创建一个视图源,这就是它工作的原因。
HTH,