2011-06-09 64 views
4

首先,我想感谢你们所有的精彩输入。我必须承认 - StackOverflow一直是最好的同伴导师资源,因此它为我提供了更多的知识,比......“大学”中的4年。谢谢!Silverlight 4 - 通过XAML声明/填充控件的集合属性?

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

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> 

这是可能的,如果是这样,我该如何去做呢?

回答

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> 
2

如果您使用的是.NET 4.0,你应该能够与X引用泛型:TypeArguments参数(part of the XAML2009 spec) - 所以你的论点观察集合定义应该像:

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