簡體   English   中英

數據源列表更改時如何更新自定義依賴項屬性

[英]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
            }
        }
    }
  1. 如果綁定到ObservableCollection ,則在將集合替換為另一個集合時(而不是在更改集合的內容時)會收到更改通知。 因此,您需要在代碼隱藏中訂閱CollectionChanged事件。
  2. 如果您訂閱CollectionChanged ,則可以在ObservableCollection看到哪些是新的/刪除的項目 您可以為每個新項目添加新形狀,並為已刪除項目刪除舊形狀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM