2009-12-01 84 views
1

我覺得我已經錯過了一些明顯的綁定屬性值,但在Silverlight創建一個自定義的控制,如果我能作爲公共聲明屬性的時候,就會使XAML聲明時被曝光,所以我可以很容易地做這樣的事情:聲明列表,並通過XAML自定義Silverlight控件

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

而且這樣的:

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

但是性能並不總是簡單的類型,我可能有一個複雜的特性,如定義1列或多列的列表並確定一個字段綁定到我噸。與現有的控制用於定義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;} // ? 
} 

任何人都可以點我在正確的方向來製作暴露列表和綁定屬性?

回答

2

對於Columns集合創建備份私有變量保存一個實例收集並刪除set訪問: -

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

對於它看起來像什麼,你可能想的是綁定類型本身System.Windows.Data.Binding綁定屬性。不過,我想我需要更多地瞭解一下你打算如何處理這個對象。

你應該考慮使MyControlTitle屬性的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保持公約與現有的控制。

我不禁感到有此車輪的一些重新發明,確實數據網格或列表框或一些其他類似的控制不會削減它適合你?

+0

這確實描述了我在做什麼 - 我實際上需要一個控件,它的行爲像一個基於設置的高度自定義的DataGrid *或* ListBox。我打算讓我的類簡單地包裝和重用這些控件,但由於提供的值不會直接在這些控件中(我不想公開所有屬性),我不能只從其中一個繼承。 – David 2009-12-01 17:28:10