如何通过界面填充集合? 这是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>
,并且不希望客户端代码依赖于它。
答案 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>
类型之间进行更改非常简单明了。
另一个可能的选择是实现一个包装类,该包装类同时继承IList
和IList<T>
接口。这样做的好处是,可以在拥有强类型集合的情况下使用实现IList<T>
的任何具体类型。