【问题标题】:Populating a collection in XAML在 XAML 中填充集合
【发布时间】:2018-09-16 08:52:09
【问题描述】:

如何通过界面填充集合? 这是 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&lt;T&gt;,并且不希望客户端代码依赖它。

【问题讨论】:

  • 看起来该错误意味着您需要将 set 访问器添加到您的测试中,因为您正在尝试在 xaml 中设置集合?
  • 不,事实并非如此。它添加到List&lt;T&gt; { get; },但无法编译IList&lt;T&gt; { get; }
  • 只是为了澄清 - WPF 与 { get;仅在填充集合属性时。不这样想是一个常见的错误。不幸的是,没有对通用接口的适当支持——这项技术处于僵尸模式太久了。

标签: c# wpf xaml .net-4.7.2


【解决方案1】:

使用 XAML 中存在的类型定义处理 XAML。它无法查看实际使用的实例。

XAML 处理器使用非通用IList 接口将项目添加到集合中,然后处理器生成代码。因为IList&lt;T&gt; 接口没有实现这些接口中的任何一个,所以无法将项目添加到 XAML 中的集合中。 List&lt;T&gt; 实现了 IList 接口,这就是它按预期编译的原因。

如果AdvisableCollection&lt;T&gt; 实现IList,您可以简单地使用IList,这可能是不可取的,因为您失去了强类型接口。

如果AdvisableCollection&lt;T&gt; 实现了一个相当通用的集合类型,如System.Collections.Generic.List&lt;T&gt;System.Collections.ObjectModel.Collection&lt;T&gt;,您可以使用这些类型进行定义。虽然没有那么通用,但仍然非常通用,并且这些类型具有数量有限的附加属性和方法,这使得 IList&lt;T&gt; 类型之间的更改非常简单明了。

另一个可能的选择是实现一个继承IListIList&lt;T&gt; 接口的包装类。这样做的好处是能够使用任何实现 IList&lt;T&gt; 的具体类型,同时拥有强类型集合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多