Silverlight 4 - 通过XAML声明/填充控件的集合属性?

时间:2011-06-09 18:24:58

标签: c# silverlight silverlight-4.0 collections user-controls

首先,我要感谢大家提供的所有精彩输入。我不得不承认 - StackOverflow是最好的同伴辅导员资源,因此它为我提供了更多的知识,而不是......在“大学”中的4年。谢谢!

我正在使用一个具有属性的控件,该属性是对象的集合。

public class UserParameter
{
    string DisplayName { get; set; }
    string Property { get; set; }
    string Type { get; set; }
}

public class ParameterBuilder: UserControl
{
    private ObservableCollection<UserParameter> parameters;

    //alright - this is really dependency property.
    //described as property just for simplicity.
    public ObservableCollection<UserParamter> Parameters
    {
        get { return this.parameters; }
        set { this.parameters = value; }
    }
}

所以这个问题的关键是弄清楚如何在Xaml中创建这个集合。例如:

<custom:ParameterBuilder Name="Parameter">
    <custom:ParameterBuilder.Parameters>
        <custom:UserParameter DisplayName="Test 0" Property="Size"  Type="String"/>
        <custom:UserParameter DisplayName="Test 1" Property="Value" Type="Decimal"/>
    </custom:ParameterBuilder.Parameters>
</custom:ParameterBuilder>

这是否可行,如果可行,我该如何去做?

2 个答案:

答案 0 :(得分:2)

如果您使用的是.NET 4.0,则应该能够使用x:TypeArguments参数(part of the XAML2009 spec)引用泛型 - 因此您的参数中的Observable Collection将被声明为:

<ObservableCollection x:TypeArguments="UserParameter">
    <l:UserParameter DisplayName="Test 0" Property="Size" Type="String" />
    <l:UserParameter DisplayName="Test 1" Property="Value" Type="Decimal" />
</ObservableCollection />

答案 1 :(得分:1)

通常,集合属性应该是普通的(非依赖性)只读属性。 XAML解析器非常智能,可以将项添加到集合属性中。例如:

public class ParameterBuilder: UserControl
{
    private ObservableCollection<UserParameter> parameters = new ObservableCollection<UserParameter>();

    // Don't make it a dependency property
    public ObservableCollection<UserParamter> Parameters
    {
        get { return this.parameters; }
    }
}

你可以像你描述的那样使用它:

<custom:ParameterBuilder Name="Parameter">
    <custom:ParameterBuilder.Parameters>
        <custom:UserParameter DisplayName="Test 0" Property="Size"  Type="String"/>
        <custom:UserParameter DisplayName="Test 1" Property="Value" Type="Decimal"/>
    </custom:ParameterBuilder.Parameters>
</custom:ParameterBuilder>