[英]UWP User control: collection changed event of a binded dependency property
[英]Using a collection of an abstract type, or interface, as a Dependency Property of a UWP Templated Control
我的模型有两个类ItemA
和ItemB
,它们实现了ICustomControlItem
接口,它们实现如下......
public interface ICustomControlItem
{
string Text { get; set; }
}
public class ItemA : ICustomControlItem
{
public string Text { get; set; }
}
public class ItemB : ICustomControlItem
{
public string Text { get; set; }
}
我的目标是创建一个模板控件CustomControl
,它具有一个(依赖)属性Items
,它是一个ObservableCollection<ICustomControlItem>
。 使用了ObservableCollection<T>
,因为我希望在集合更改时更新视图。
因此,控制定义如下......
[ContentProperty(Name = nameof(Items))]
public sealed class CustomControl : Control
{
public CustomControl()
{
DefaultStyleKey = typeof(CustomControl);
Items = new ObservableCollection<ICustomControlItem>();
}
public ObservableCollection<ICustomControlItem> Items
{
get { return (ObservableCollection<ICustomControlItem>)GetValue(ItemsProperty); }
set { SetValue(ItemsProperty, value); }
}
public static readonly DependencyProperty ItemsProperty =
DependencyProperty.Register(nameof(Items), typeof(ObservableCollection<ICustomControlItem>), typeof(CustomControl), new PropertyMetadata(new ObservableCollection<ICustomControlItem>()));
}
...使用包含ListView
XAML ControlTemplate
来显示Items
依赖Items
属性的Items
...
<ControlTemplate TargetType="local:CustomControl">
<Grid>
<ListView ItemsSource="{TemplateBinding Items}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</ControlTemplate>
我使用以下XAML初始化并填充(使用ItemA
和ItemB
类的对象)XAML页面上的CustomControl
实例。
<local:CustomControl>
<local:ItemA Text="Item #1" />
<local:ItemB Text="Item #2" />
<local:ItemA Text="Item #3" />
</local:CustomControl>
此时我期望一切顺利,因为ItemA
和ItemB
实现了ICustomControlItem
接口。 但是,Visual Studio一直给我一个警告,上面写着......
“ItemA”类型的值无法添加到“ObservableCollection”类型的集合或字典中
但是,尽管有错误,XAML在设计器中正确呈现,并且应用程序运行正常,但IntelliSense在VS假定的XAML中不起作用。
我怀疑问题是使用ObservableCollection
因为错误不会发生时,
Items
是一个ObservableCollection<object>
(但是我需要将它约束到ICustomControlItem
接口)。 Items
是一个ObservableCollection<string>
并且<x:String>
元素被添加到控件中。 如何解决此问题,并实现作为抽象类型或接口的集合的依赖项属性 ?
看起来,问题是我安装的Visual Studio 2017 Community Edition(或其中一个模块)版本的错误。 更新IDE(到Version 15.2 (26430.14) Release
)解决了该问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.