对于自定义DataTemplateSelector,,我使用了ContentProperty属性,该属性应该表示DataTemplates.的集合。
[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”上设置内容属性“模板”。“模板”的访问级别不正确,或者其程序集不允许访问。
发布于 2018-08-07 11:18:14
为了接受多个对象元素作为内容,XAML内容属性的类型必须作为集合类型支持。
虽然这很模糊,但是如果ContentProperty类型是一个集合,那么它必须实现非泛型IList接口,List<T>是这样做的,但是IList<T>没有。
所以
public IList Templates { get; } = new List<DataTemplate>();很管用,但是
public IList<DataTemplate> Templates { get; } = new List<DataTemplate>();不是,因为IList<DataTemplate>不是IList。
https://stackoverflow.com/questions/51723146
复制相似问题