![](/img/trans.png)
[英]Custom Control: How to Call Method When Inherited Dependency Property Changes?
[英]How to update a custom dependency property when the datasource list changes
我們有一個帶有自定義依賴項屬性(DP)的用戶控件。 DP綁定到ObservableCollection。
以編程方式將新項目添加到集合中時,數據綁定不會更新目標DP。 為什么? 我們認為這是因為,不幸的是,在我們這種情況下,目標不是ListBox或ListView,而是Canvas。 DP進行更改或初始化時,應該在畫布上繪制一個Shape(!),並且Shape的位置和大小將綁定到集合項的兩個屬性:WIDTH,LEFT。
理想情況下,我們不希望清除畫布並重新繪制所有項目,因為已添加(或刪除)了一項。 但是如何?
因此: 自定義DP如何照顧繪制新收集項目的形狀? 我們需要什么回調,什么時候必須發生,以及可能有哪些特定的MetaDataOptions?
另外,關於所有這些依賴項屬性選項,是否有任何好的資源。 他們很困惑。 MSDN並不能真正幫助我們進行嘗試。
謝謝!
編輯:
ObservableCollection就像這樣:
public class Projects : ObservableCollection<Project>
{
//no ommitted code. this class really IS empty!
}
DP就像這樣:
public class MyUserControl : UserContorl
{
public static readonly DependencyProperty... etc. typeof(Projects)
private static void OnProjectsChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyUserControl u = d as MyUserControl;
CpProjectCollection projects = e.NewValue as CpProjectCollection;
u.Refresh(projects);
}
private void Refresh(CpProjectCollection projects)
{
foreach (CpProject p in projects)
{
//...add each project to the Canvas
ProjectContorl pc = new ProjectControl();
pc.Project = project;
Binding b = new Binding("StartTime");
b.Converter = new TimeSpanConverter();
b.Source = pc.Project;
b.Mode = BindingMode.TwoWay;
c.SetBinding(Canvas.LeftProperty, b);
//do the same for project duration
}
}
}
ObservableCollection
,則在將集合替換為另一個集合時(而不是在更改集合的內容時)會收到更改通知。 因此,您需要在代碼隱藏中訂閱CollectionChanged
事件。 CollectionChanged
,則可以在ObservableCollection
看到哪些是新的/刪除的項目 。 您可以為每個新項目添加新形狀,並為已刪除項目刪除舊形狀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.