绑定不更新 - 检测面板子项已添加

时间:2011-05-20 08:18:05

标签: silverlight binding panel dependency-properties

我目前正在实现一个继承自Panel的布局控制器,能够检测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设计器中获得了更好的功能(当我将它们放在那里时会有很多烦人的MessageBox)...

如果有人知道更好的方法,或者可以看到我做错了什么,请非常,非常感谢!

编辑 - 更多信息: 我的最终目标是创建一个灵活的类,可以扩展任何当前的Panel类(例如Grids和StackPanels),因为它们密封了覆盖函数,我希望找到一个解决方法,用于检测添加的子代等等。

1 个答案:

答案 0 :(得分:1)

您应该重写方法ArrangeOverrideMeasureOverride,这些是您进行自定义布局的地方。每当Children成员资格发生变化时,就会出于各种原因调用它们。