使用抽象类型或接口的集合作为UWP模板化控件的依赖属性

时间:2017-06-24 15:20:59

标签: c# xaml data-binding uwp observablecollection

我的模型有两个类ItemAItemB,它们实现了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初始化并填充(使用ItemAItemB类的对象)XAML页面上CustomControl的实例。

<local:CustomControl>
    <local:ItemA Text="Item #1" />
    <local:ItemB Text="Item #2" />
    <local:ItemA Text="Item #3" />
</local:CustomControl>

此时我希望一切顺利,因为ItemAItemB都会实现ICustomControlItem接口。但是,Visual Studio不断给我一个警告,上面写着......

  

“ItemA”类型的值无法添加到“ObservableCollection”类型的集合或词典中

然而,尽管存在错误,XAML在设计器中正确呈现,并且应用程序运行正常,但IntelliSense在VS假定的XAML中不起作用。

Screenshot

我怀疑问题是使用ObservableCollection,因为错误不会发生时,

  1. ItemsObservableCollection<object>(但我需要将其约束到ICustomControlItem接口)。
  2. Items是一个ObservableCollection<string><x:String>元素已添加到控件中。
  3. 如何解决此问题,是否实现了作为抽象类型或接口的集合的依赖项属性?

1 个答案:

答案 0 :(得分:0)

看起来,问题是我安装的Visual Studio 2017 Community Edition(或其中一个模块)版本的错误。更新IDE(Version 15.2 (26430.14) Release)解决了这个问题。