在XAML中填充集合

时间:2018-09-16 08:52:10

标签: c# wpf xaml .net-4.7.2

如何通过界面填充集合? 这是XAML:

    <local:ViewModel>
        <local:Test Text="Hmm!"/>
    </local:ViewModel>

以下是适用的模型:

[ContentProperty("Tests")]
public class ViewModel
{
    public List<Test> Tests { get; } = new List<Test>();
}

位置:

public class Test
{
    public string Text { get; set; }
}

我想使用该界面:

[ContentProperty("Tests")]
public class ViewModel
{
    public IList<Test> Tests { get; } = new List<Test>();
}

不幸的是它不能编译:

  

无法在元素“ ViewModel”上设置内容属性“ Tests”。 “测试”   访问级别不正确或其程序集不允许访问。

我实际上实例化了PostSharp AdvisableCollection<T>,并且不希望客户端代码依赖于它。

1 个答案:

答案 0 :(得分:0)

使用XAML中存在的类型定义来处理XAML。它不具有实际使用实例的可见性。

XAML处理器使用非通用的IList接口将项目添加到集合中,并且处理器生成代码。因为IList<T>接口没有实现这两个接口,所以不能在XAML中将项目添加到集合中。 List<T>实现了IList接口,这就是为什么它可以按预期进行编译的原因。

如果AdvisableCollection<T>实现了IList,则可以简单地使用IList,这可能是不希望的,因为会丢失强类型接口。

如果AdvisableCollection<T>实现了一个相当普遍的集合类型,例如System.Collections.Generic.List<T>System.Collections.ObjectModel.Collection<T>,则可以将这些类型用于定义。虽然不那么通用,但仍然相当通用,并且这些类型具有数量有限的其他属性和方法,这些属性和方法使在IList<T>类型之间进行更改非常简单明了。

另一个可能的选择是实现一个包装类,该包装类同时继承IListIList<T>接口。这样做的好处是,可以在拥有强类型集合的情况下使用实现IList<T>的任何具体类型。