【发布时间】:2015-06-11 12:29:21
【问题描述】:
我正在尝试使用DependencyProperty 制作自定义控件。
但我无法将我的ObservableCollection 绑定到控件。
当我使用Enumerable 时,我没有问题。但我需要将项目添加到集合中,所以我唯一的选择是 ObservableCollection。
创建授权:
AuthorizationsDest = new ObservableCollection<Authorization>();
AuthorizationsDest.Add(new Authorization() { Key = "Test1", Description = "Test1", ObjectState = ObjectState.UnModified });
}
xaml 中的自定义控件
<customControls:ListBoxEditLookup ItemsSource="{Binding Authorizations}" DisplayMember="Description" DestinationList="{Binding AuthorizationsDest}" />
DependencyProperty:
[Description("Binded destination list"), Category("Data")]
public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register("DestinationList", typeof(ObservableCollection<HrdEntity>), typeof(ListBoxEditLookup), new UIPropertyMetadata(null));
public ObservableCollection<HrdEntity> DestinationList
{
get
{
return GetValue(ItemsProperty) as ObservableCollection<HrdEntity>;
}
set { SetValue(ItemsProperty, value); }
}
【问题讨论】:
-
“不绑定”是什么意思?你有错误吗?是否记录了任何绑定警告?
-
您为什么希望它能够工作?
DestinationList是ObservableCollection<HrdEntity>类型,而AuthorizationsDest是ObservableCollection<Authorization>类型。换句话说,它们有两种不兼容的类型。 -
@Ghost:
ItemsSourceinItemsControl的类型为IEnumerable(几乎所有与集合相关的类型都实现了该类型)。控件在内部检查是否可以将可枚举对象转换为更专业的集合。 -
@Ghost 假设控件中的类型是
IEnumerable,您可以检查它实现了哪些接口并有条件地启用控件的某些功能。例如,if (value is INotifyCollectionChanged)将告诉您是否可以侦听集合更改事件,if (value is IList)将告诉您是否可以使用索引运算符对集合进行索引。将其专门输入为ObservableCollection<T>严重限制了它的使用方式(例如,我在我的项目中使用自己的ObservableList<T>类,因为ObservableCollection<T>的 API 非常有限。)
标签: c# wpf observablecollection dependency-properties