【问题标题】:WPF – Collection ContentPropertyWPF – 集合内容属性
【发布时间】: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>

我的问题是为什么我不能使用IListICollection 数据类型来代替List 数据类型。

如果我使用这些类型,我会收到编译错误 无法在元素“CustomTemplateSelector”上设置内容属性“模板”。 “模板”的访问级别不正确或其程序集不允许访问。

【问题讨论】:

  • public IList Templates { get; } = new List&lt;DataTemplate&gt;(); 工作。
  • @Clemens:感谢您的尝试。它不适用于目标 .NET 框架 4.6.1/4.7/4.7.1。
  • 请注意,它是IList,而不是IList&lt;DataTemplate&gt;
  • 就是这样 - 非通用 IList 工作正常。因此,我必须使用特定的实现,如 List&lt;DataTemplate&gt; 或非泛型的实现,开发人员可能还包括 DataTemplate 以外的其他类型。
  • 我只是好奇IList&lt;DataTemplate&gt;的使用有什么问题。

标签: c# wpf xaml


【解决方案1】:

ContentPropertyAttribute 文档说

为了接受多个对象元素作为内容,XAML 内容属性的类型必须支持作为集合类型。

虽然这很模糊,但似乎如果ContentProperty 类型是一个集合,它必须实现非泛型IList 接口,List&lt;T&gt; 可以做到,但IList&lt;T&gt; 没有。

所以

public IList Templates { get; } = new List<DataTemplate>();

有效,但是

public IList<DataTemplate> Templates { get; } = new List<DataTemplate>();

没有,因为IList&lt;DataTemplate&gt; 不是IList

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 2014-10-05
    • 2011-09-20
    相关资源
    最近更新 更多