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

时间:2009-12-01 16:41:15

标签: silverlight xaml silverlight-3.0 binding properties

我觉得我错过了一些明显的东西,但是当在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;} // ?
}

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

1 个答案:

答案 0 :(得分:2)

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

private ObservableCollection<MyControlColumn> _columns = new ObservableCollection<MyControlColumn>();
public ObservableCollection<MyControlColumn> Columns {get { return _columns; } }

对于Binding属性,它看起来像你想要的是Binding类型本身System.Windows.Data.Binding。但是,我想我需要了解更多关于你想要用它做什么的事情。

您应该考虑将MyControl Title属性设为DependencyProperty: -

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);

同样适用于ItemSource,但您也应该重命名为ItemsSource以保持现有控件的约定。

我不禁觉得这里有一些重新发明的轮子,DataGrid或ListBox或其他类似的控件是不是为你剪掉了它?