【问题标题】:WPF ListBox Selection Problem when changing an item更改项目时的WPF列表框选择问题
【发布时间】:2009-05-13 03:28:06
【问题描述】:

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

有没有办法解决这个问题?

这是一个演示问题的示例应用程序。

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

【问题讨论】:

    标签: c# .net wpf xaml listbox


    【解决方案1】:

    经过一番搜索,我找到了解决方案。向 ListBox 添加 IsSynchronizedWithCurrentItem 解决了这个问题。

    <ListBox 
        x:Name="lst" 
        ItemsSource="{Binding Items}" 
        IsSynchronizedWithCurrentItem="True"
        />
    

    【讨论】:

      【解决方案2】:

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

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

      希望对和我有同样问题的人有所帮助。

      【讨论】:

        【解决方案3】:

        不过,这不是一个好的答案,而且我个人不会对此感到满意,所以我试了一下,找到了一个替代方案。

        仅当当前选择了您正在更改的项目并且您直接绑定到源时才会发生这种情况。

        在ListBox 和您的视图模型之间使用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" 在幕后为你创建了一个视图源,这就是它起作用的原因。

        HTH,

        【讨论】:

        • 问题出在 SelectedItems,而不是 ItemsSource。
        • 那么你为什么不喜欢使用 IsSynchronizedWithCurrentItem?
        猜你喜欢
        • 1970-01-01
        • 2010-12-29
        • 1970-01-01
        • 2010-12-09
        • 1970-01-01
        • 1970-01-01
        • 2018-12-09
        • 1970-01-01
        • 2018-06-24
        相关资源
        最近更新 更多