WPF列表框选择更改项目时出现问题

时间:2009-05-13 03:28:07

标签: c# .net wpf xaml listbox

当更改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

3 个答案:

答案 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,