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

时间:2015-06-10 09:06:28

标签: c# wpf dependency-properties multi-select

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

MultiSelectCombobox.xaml < - 我的自定义控件xaml继承自组合框

<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());

在某些组合框事件中使用此2行来显示selecteditem。

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

1 个答案:

答案 0 :(得分:1)

试试这个......

<强> 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并且可能使用ObservableCollection来监听集合中的更改,并相应地更新ListBox选择。