我可以为多选组合框创建 SelectedItems 属性

Can i create SelectedItems Property for multiselect combobox

目前我正在研究 multiselect combobox 继承组合框的自定义控件,它将列表框附加到具有多选模式的组合框。但是现在我在将所选项目传递到视图中的自定义控件时遇到了问题。我使用列表框 selectionchanged 事件来更新我在组合框中选择的项目。我能够在 selecteditem 上实施这种方法,它设法将一个选定的项目传递到我的视图。但我想将所有选定的项目传递给我的视图。 这就是我到目前为止所做的。

MultiSelectCombobox.xaml <-- 我的自定义控件 xaml 继承自 combobox

<ComboBox.Template>
...
<Popup>
    <ListBox SelectionMode="Multiple" ItemsSource="{TemplateBinding ItemsSource}" 
    SelectionChanged="ListBox_SelectionChanged">
     ...
    </ListBox>
</Popup>

MultiSelectCombobox.xaml.cs

   public partial class MultiSelectComboBox : ComboBox
...
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ListBox lb = sender as ListBox;
    this.SelectedItem = lb.SelectedItem;
}

MainWindow.xaml.cs

MultiComboBox mComboBox = (sender as MultiComboBox);
MessageBox.Show(this, mComboBox.SelectedItem.ToString());

在某些组合框事件中使用这两行来显示所选项目。

我搜索了几个帖子,但仍然找不到任何解决方案,如果您能为我提供一些指导,我将不胜感激。

试试这个...

MultiSelectCombobox.xaml.cs

public partial class MultiSelectComboBox : ComboBox
{

    ...

    public static readonly DependencyProperty SelectedItemsProperty =
        DependencyProperty.Register("SelectedItems", typeof(IList),
        typeof(MultiSelectComboBox));

    private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ListBox lb = sender as ListBox;
        this.SelectedItem = lb.SelectedItem;
        this.SelectedItems = lb.SelectedItems;
    }

}

请记住,这仅适用于一种方式选择。如果您想确保它仅用于获取选定的项目并且没有人尝试以这种方式设置它们,您可以将 DependencyProperty 变成只读的并使用 IEnumerable 而不是 IList。

如果您想支持两种方式的选择更改(通过代码更改所选项目,而不仅仅是通过用户与 ListBox 的交互),那么您必须向 DependencyProperty 添加一个 属性 changed 回调,也许使用 ObservableCollection 来监听集合中的变化,并相应地更新 ListBox 选择。