2011-05-20 34 views
1

我目前正在實施一種繼承自Panel的Layout Conainer,並且能夠檢測Panel.Children中的更改並檢測新元素/已刪除元素。綁定未更新 - 添加檢測面板的兒童

目前,我有一個依賴屬性綁定到Panel.Children.Count值,這非常笨重,但我不知道創建此類偵聽器的更好方法。

public abstract class MyLayoutContainer : Panel 
{ 
    private Binding countBinding; 

    // ctor... 

    private void InitializeBinding() 
    { 
     countBinding = new Binding("Count"); 
     countBinding.Source = this.Children; 
     // Using the comment below instead of "Count" 
     // in the Binding constructor throws an error 
     //countBinding.Path = new PropertyPath(UIElementCollection.CountProperty); 
     countBinding.Mode = BindingMode.OneWay; 
     BindingOperations.SetBinding(this, MyLayoutContainer.BoundChildCountProperty, countBinding); 
    } 

    // ... 

    private static readonly DependencyProperty BoundChildCountProperty 
     = DependencyProperty.Register 
     (
      "BoundChildCount", 
      typeof(int), 
      typeof(MyLayoutContainer), 
      new PropertyMetadata(0, ChildCountChange) 
     ); 

    private static int GetBoundChildCount(MyLayoutContainer depObj) 
    { 
     return (int)depObj.GetValue(BoundChildCountProperty); 
    } 
    private static void SetBoundVisibility(MyLayoutContainer depObj, int value) 
    { 
     depObj.SetValue(BoundChildCountProperty, value); 
    } 


    private static void ChildCountChange(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     MyLayoutContainer mlc = d as MyLayoutContainer; 

     // For testing, this function is currently empty 
     // however normally it checks children against a 
     // shadow list, or will remove them as they're 
     // added. 
     mlc.ChildrenChanged(e.OldValue, e.NewValue); 
    } 
} 

問題是它只更新一次。這幾乎就好像我已經設置了BindingMode.OneTime,情況並非如此。當我檢查BoundChildCountPropertythis.Children.Count時,我得到1和4.我不知道發生了什麼,因爲我已經使用了完全相同的方法來綁定另一個對象的可見性來創建「偵聽器」。另外,我在XAML設計器中獲得了更好的功能(如果有很多令人討厭的MessageBoxes,那麼當我將它們放在那裏的時候......)在加載所有對象時會更好。

請,如果有人知道這樣做的更好方法,或者可以看到我做錯了什麼,我會非常,非常感謝!

編輯 - 更多信息: 我的最終目標是創建一個靈活的類,它可以擴展任何當前面板類(如電網和StackPanels)的和,因爲他們密封覆蓋功能,我希望能找到一個檢測添加的孩子的解決方法等。

+0

雖然此問題尚未直接解決,但下面AnthonyWJones提出的解決方案對於處於類似情況的人來說是一種令人滿意的解決方法。 – Melodatron 2011-05-23 15:27:32

回答

1

您應該重寫方法ArrangeOverrideMeasureOverride,這些是您進行自定義佈局的位置。無論何時只要Children成員資格發生變化,他們都會被召喚出於各種原因。

+0

@AWJ感謝您的回答,但是......部分問題是我想創建一個擴展的Grid類,並且由於C#中相當令人沮喪的'sealed'修飾符,我無法在子類中重寫這些函數-類。 目前,我正在動態創建基本面板類型(StackPanel,Grid,Canvas等)的成員,並試圖將添加到此類的子成員移到成員類中。很煩躁,但我沒有看到它的方式。 – Melodatron 2011-05-20 11:59:20

+0

@Melodatron:在這種情況下,爲什麼要使用Panel的衍生產品?從一個簡單的自定義控件開始,它具有一個'Panel'作爲必需的'TemplatePart'。使用您可以控制的集合類型實現您自己的「Children」屬性,並以您認爲合適的方式將成員轉發到內部「Panel」。 – AnthonyWJones 2011-05-20 12:23:44

+0

@AWJ我會放棄一切,回到你身邊。謝謝你的幫助。 – Melodatron 2011-05-20 12:27:30