我觉得我错过了一些明显的东西,但是当在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;} // ?
}
有人能指出我制作暴露列表和绑定属性的正确方向吗?
答案 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或其他类似的控件是不是为你剪掉了它?