【发布时间】:2018-08-07 19:18:14
【问题描述】:
在自定义 DataTemplateSelector 的情况下,我使用了应该代表 DataTemplates 集合的 ContentProperty 属性。
[ContentProperty(nameof(Templates))]
public class CustomTemplateSelector : DataTemplateSelector
{
public List<DataTemplate> Templates { get; } = new List<DataTemplate>();
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
/* … */
}
}
XAML中的用法:
<ItemsControl ItemsSource="{Binding MyCollection}">
<ItemsControl.ItemTemplateSelector>
<local:CustomTemplateSelector>
<DataTemplate DataType="{x:Type system:Boolean}">
<Label>BOOL</Label>
</DataTemplate>
<DataTemplate DataType="{x:Type system:String}">
<Label>STRING</Label>
</DataTemplate>
</local:CustomTemplateSelector>
</ItemsControl.ItemTemplateSelector>
</ItemsControl>
我的问题是为什么我不能使用IList 或ICollection 数据类型来代替List 数据类型。
如果我使用这些类型,我会收到编译错误 无法在元素“CustomTemplateSelector”上设置内容属性“模板”。 “模板”的访问级别不正确或其程序集不允许访问。
【问题讨论】:
-
public IList Templates { get; } = new List<DataTemplate>();工作。 -
@Clemens:感谢您的尝试。它不适用于目标 .NET 框架 4.6.1/4.7/4.7.1。
-
请注意,它是
IList,而不是IList<DataTemplate>。 -
就是这样 - 非通用
IList工作正常。因此,我必须使用特定的实现,如List<DataTemplate>或非泛型的实现,开发人员可能还包括DataTemplate以外的其他类型。 -
我只是好奇
IList<DataTemplate>的使用有什么问题。