我的模型有兩類ItemA
和ItemB
,其實現ICustomControlItem
接口,並且它們都執行如下...使用抽象類或接口的集合,作爲一個依賴屬性一個UWP模板化控件
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在XAML頁面上初始化並填充的實例(使用ItemA
和ItemB
類的對象)。
<local:CustomControl>
<local:ItemA Text="Item #1" />
<local:ItemB Text="Item #2" />
<local:ItemA Text="Item #3" />
</local:CustomControl>
在這一點上,我希望大家很好,因爲這兩個ItemA
和ItemB
實現ICustomControlItem
接口。但是,Visual Studio中不斷給我,上面寫着警告...
類型的值「意達」不能被添加到一個集合或類型「的ObservableCollection」的字典
然而,儘管錯誤,XAML在設計器中正確渲染,並且應用程序運行良好,但IntelliSense在VS假定的XAML中不起作用。
我懷疑問題出在ObservableCollection
的使用,因爲錯誤不會發生時,
Items
是ObservableCollection<object>
(但是我需要它被限制在ICustomControlItem
接口)。Items
是ObservableCollection<string>
和<x:String>
元素被添加到控件。
如何將這個問題解決,這是一個抽象類或接口的集合依賴項屬性,來實現?
奇怪。我在VS或Blend中的XAML中看不到任何IntelliSense錯誤。 –