我的模型有两个类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>()));
}
...其XAML ControlTemplate
包含ListView
以显示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>
元素已添加到控件中。如何解决此问题,是否实现了作为抽象类型或接口的集合的依赖项属性?
答案 0 :(得分:0)
看起来,问题是我安装的Visual Studio 2017 Community Edition(或其中一个模块)版本的错误。更新IDE(Version 15.2 (26430.14) Release
)解决了这个问题。