我目前正在實施一種繼承自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
,情況並非如此。當我檢查BoundChildCountProperty
與this.Children.Count
時,我得到1和4.我不知道發生了什麼,因爲我已經使用了完全相同的方法來綁定另一個對象的可見性來創建「偵聽器」。另外,我在XAML設計器中獲得了更好的功能(如果有很多令人討厭的MessageBoxes,那麼當我將它們放在那裏的時候......)在加載所有對象時會更好。
請,如果有人知道這樣做的更好方法,或者可以看到我做錯了什麼,我會非常,非常感謝!
編輯 - 更多信息: 我的最終目標是創建一個靈活的類,它可以擴展任何當前面板類(如電網和StackPanels)的和,因爲他們密封覆蓋功能,我希望能找到一個檢測添加的孩子的解決方法等。
雖然此問題尚未直接解決,但下面AnthonyWJones提出的解決方案對於處於類似情況的人來說是一種令人滿意的解決方法。 – Melodatron 2011-05-23 15:27:32