繁体   English   中英

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

[英]Using a collection of an abstract type, or interface, as a Dependency Property of a UWP Templated Control

我的模型有两个类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>()));
}

...使用包含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初始化并填充(使用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中不起作用。

截图

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

  1. Items是一个ObservableCollection<object> (但是我需要将它约束到ICustomControlItem接口)。
  2. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM