c# - 如何同步ListBox的SelectedItem?

标签 c# wpf listbox

我有一个绑定(bind)到 ObservableCollection 的 ListBox。列表中的每个对象都实现一个名为 ISelectable 的接口(interface)

public interface ISelectable : INotifyPropertyChanged
{
    event EventHandler IsSelected;
    bool Selected { get; set; }
    string DisplayText { get; }
}

我想跟踪选择了哪个对象,无论它是如何选择的。用户可以单击列表框中对象的表示,但也可以通过代码选择对象。如果用户通过 ListBox 选择一个对象,我会将所选项目转换为 ISelectable 并将 Selected 属性设置为 true。

ISelectable selectable = (ISelectable)e.AddedItems[0];
selectable.Selected = true;

我的问题是,当我使用代码选择对象时,我无法让 ListBox 更改所选项目。我使用 DataTemplate 以不同的颜色显示所选对象,这意味着所有内容都显示正确。但是 ListBox 将用户单击的最后一个对象作为 SelectedItem,这意味着如果不首先选择列表中的另一个对象,则无法单击该项目。

有人知道如何解决这个问题吗?我很确定我可以通过编写一些自定义代码来处理鼠标和键盘事件来完成我想要的任务,但我不愿意。我尝试将 SelectedItem 属性添加到集合中并将其绑定(bind)到 ListBox 的 SelectItemProperty 但没有成功。

最佳答案

您还可以通过将 ListBoxItem.IsSelected 数据绑定(bind)到 Selected 属性来实现此目的。这个想法是在创建每个 ListBoxItems 时设置它们的绑定(bind)。这可以使用针对为 ListBox 生成的每个 ListBoxItem 的样式来完成。

这样,当列表框中的某个项目被选择/取消选择时,相应的 Selected 属性将被更新。同样,在代码中设置 Selected 属性将反射(reflect)在 ListBox 中

为此,Selected 属性必须引发 PropertyChanged 事件。

<List.Resources>
    <Style TargetType="ListBoxItem">
        <Setter 
            Property="IsSelected" 
            Value="{Binding 
                        Path=DataContext.Selected, 
                        RelativeSource={RelativeSource Self}}" 
            />
    </Style>
</List.Resources>

关于c# - 如何同步ListBox的SelectedItem?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/268674/

相关文章:

ios - 按用户定义的标准对列表框进行排序 - delphi xe6

wpf - 将禁用的列表框背景更改为灰色

c# - 从 C# winforms 中 SizeMode=stretch 的用户 Drawn PictureBox 保存图像

wpf - 如何设置用户控件的数据上下文

wpf - 3D 模型与 WPF 中的深度缩放

wpf - MVVM:处理集合中模型的逻辑子对象

c# - 添加SqlParameter绑定(bind)LIKE '%@x%'

c# - 策略模式的实现如何在运行时选择正确的策略?

c# - 如何在 .NET 中将 Stream 设为 "fork"?

c# - 为什么在 XAML 中添加的 ListBoxItems 没有样式?