【发布时间】:2018-07-10 16:01:28
【问题描述】:
由于ListBox 不允许您双向绑定到其SelectedItems 属性,因此我创建了自己的自定义控件MultipleSelectionListBox。它添加了属性BindableSelectedItems,让您可以将IEnumerable 绑定到它。
public class MultipleSelectionListBox : ListBox
{
public static readonly DependencyProperty BindableSelectedItemsProperty =
DependencyProperty.Register("BindableSelectedItems",
typeof(IEnumerable), typeof(MultipleSelectionListBox),
new FrameworkPropertyMetadata(default(IEnumerable),
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnBindableSelectedItemsChanged));
public IEnumerable BindableSelectedItems
{
get => (IEnumerable)GetValue(BindableSelectedItemsProperty);
set => SetValue(BindableSelectedItemsProperty, value);
}
protected override void OnSelectionChanged(SelectionChangedEventArgs e)
{
base.OnSelectionChanged(e);
BindableSelectedItems = SelectedItems;
}
private static void OnBindableSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is MultipleSelectionListBox listBox)
listBox.SetSelectedItems(listBox.BindableSelectedItems);
}
}
我绑定到的视图模型的属性是IEnumerable<string> 类型,并且绑定不起作用。当列表框的选择改变时,视图模型的属性总是接收null。
如果我将BindableSelectedItems 的类型更改为IEnumerable<string>,则绑定有效。这让我相信绑定不喜欢类型不匹配。我是否不得不明确指定列表项的类型,还是有办法让它保持通用?如果能够将相同的MultipleSelectionListBox 用于其他类型的项目,那就太好了。
【问题讨论】:
-
你错过了什么吗?在这两种情况下,您都提到 ViewModel 属性是
IEnumerable<String>类型。 -
@dhilmathy 是的,谢谢。我更正了这个问题。
-
尝试在此处使用 IEnumerable
甚至 IEnumerable -
“由于 ListBox 不允许您双向绑定到其 SelectedItems 属性”。你的意思是你不能从vm设置selectedItem?你可以这样做。您既可以从视图中设置它,也可以从视图模型中设置它。你的虚拟机是否实现了 INotifyPropertyChanging、INotifyPropertyChanged?
-
@GianlucaConte
SelectedItem没有问题。问题在于SelectedItems(注意复数)。
标签: c# wpf data-binding listbox