通过XAML为自定义silverlight控件声明列表和绑定属性值

通过XAML为自定义silverlight控件声明列表和绑定属性值,silverlight,xaml,silverlight-3.0,binding,properties,Silverlight,Xaml,Silverlight 3.0,Binding,Properties,我觉得我错过了一些显而易见的东西,但在Silverlight中创建自定义控件时,我可以将属性声明为公共属性,并且在进行XAML声明时它们将被公开,因此我可以轻松地执行以下操作: public class MyControl : UserControl { public string Title {get; set;} } 这是: <local:MyControl Title="Hello World" /> 但是属性并不总是简单的类型,我可能有一个复杂的属性,比如定义

我觉得我错过了一些显而易见的东西,但在Silverlight中创建自定义控件时,我可以将属性声明为公共属性,并且在进行XAML声明时它们将被公开,因此我可以轻松地执行以下操作:

public class MyControl : UserControl
{
    public string Title {get; set;}
}
这是:

<local:MyControl Title="Hello World" />

但是属性并不总是简单的类型,我可能有一个复杂的属性,比如定义一个或多个列并标识要绑定到它的字段的列表。对于现有控件,在XAML中定义这些值的语法非常简单:

<local:MyControl Title="People List">
   <local:MyControl.Columns>
      <local:MyControlColumn Heading="Column 1" Binding="{Binding Name}" />
      <local:MyControlColumn Heading="Column 2" Binding="{Binding Age}" />
   </local:MyControl.Columns>
</local:MyControl>

但是,我不知道如何在类定义中实现这一点:

public class MyControl : UserControl
{
    public string Title {get; set;}
    public IEnumerable ItemSource {get; set;}
    public ObservableCollection<MyControlColumn> Columns {get; set;} // ?
}

public class MyControlColumn
{
    public string Heading {get; set;}
    public ??? Binding {get; set;} // ?
}
公共类MyControl:UserControl
{
公共字符串标题{get;set;}
公共IEnumerable ItemSource{get;set;}
公共ObservableCollection列{get;set;}/?
}
公共类mycontrol列
{
公共字符串标题{get;set;}
公共???绑定{get;set;}/?
}

有人能为我指出制作公开列表和绑定属性的正确方向吗?

对于
集合,创建一个支持私有变量来保存实例集合并删除集合访问器:-

private ObservableCollection<MyControlColumn> _columns = new ObservableCollection<MyControlColumn>();
public ObservableCollection<MyControlColumn> Columns {get { return _columns; } }
类似地,对于
ItemSource
,您也应该重命名为
ItemSource
,以保持现有控件的惯例


我忍不住觉得这里有一些轮子的重新发明,DataGrid或ListBox或其他类似控件是否不适合您?

这确实描述了我正在做的事情-我实际上需要一个控件,根据设置像一个高度定制的DataGrid或ListBox。我计划让我的类简单地包装和重用这些控件,但是由于提供的值不会直接出现在这些控件中(而且我不想公开它们的所有属性),我不能仅仅从其中一个继承。
public string Title
{
    get { return (string)GetValue(TitleProperty); }
    set { SetValue(TitleProperty, value); }
}

public static readonly DependencyProperty TitleProperty =
        DependencyProperty.Register("Title", typeof(string), typeof(MyControl), null);