C# 更改项目时WPF列表框选择问题

C# 更改项目时WPF列表框选择问题,c#,.net,wpf,xaml,listbox,C#,.net,Wpf,Xaml,Listbox,在列表框中更改所选项目时,我遇到一个奇怪的错误,即更改的项目显示为选中,但我无法取消选择或重新选择它 有办法解决这个问题吗 下面是一个示例应用程序,演示了这个问题 public partial class Window1 : Window { public Window1() { InitializeComponent(); this.DataContext = new WindowViewModel(); lst.Selected

在列表框中更改所选项目时,我遇到一个奇怪的错误,即更改的项目显示为选中,但我无法取消选择或重新选择它

有办法解决这个问题吗

下面是一个示例应用程序,演示了这个问题

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>
<ListBox 
    x:Name="lst" 
    ItemsSource="{Binding Items}" 
    IsSynchronizedWithCurrentItem="True"
    />
公共部分类窗口1:窗口
{
公共窗口1()
{
初始化组件();
this.DataContext=新的WindowViewModel();
lst.SelectedIndex=0;
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
((WindowViewModel)this.DataContext)。项[0]=“新建项”;
}
}
公共类WindowViewModel
{
公共WindowViewModel()
{
Items=新的ObservableCollection();
项目。添加(“项目1”);
项目。添加(“项目2”);
项目。添加(“项目3”);
}
公共ObservableCollection项{get;set;}
}

再搜索一点后,我找到了解决方案。将IsSynchronizedWithCurrentItem添加到列表框解决了此问题

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>
<ListBox 
    x:Name="lst" 
    ItemsSource="{Binding Items}" 
    IsSynchronizedWithCurrentItem="True"
    />

不过,这不是一个好答案,我个人也不会对此感到满意,所以我尝试了一下,找到了另一个选择

只有在当前选择了要更改的项并且您直接绑定到源时,才会发生这种情况

列表框
和视图模型之间使用
CollectViewSource

<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”
正在幕后为您创建一个视图源,这就是它工作的原因


嗯,

我也有这个问题,我无法取消选择任何项目。当列表中有多个完全相同的项目时,列表框似乎无法理解。(因此,它会将它们全部选中,但不会取消选中)

当您在绑定时更改选定项的值时,也会发生这种情况。您必须首先取消选择索引(例如:listBox.SelectedIndex=-1;),然后更改该值


我希望这能帮助任何和我有同样问题的人。

问题出在SelectedItems上,而不是ItemsSource上。那么你为什么不喜欢使用IsSynchronizedWithCurrentItem呢?