我目前正在实现一个继承自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
而事实并非如此。当我检查BoundChildCountProperty
对this.Children.Count
我得到1和4.我不知道发生了什么,因为我使用了这个完全相同的方法来绑定另一个对象的可见性来创建'听众”。
此外,当我加载所有对象时,我在XAML设计器中获得了更好的功能(当我将它们放在那里时会有很多烦人的MessageBox)...
如果有人知道更好的方法,或者可以看到我做错了什么,请非常,非常感谢!
编辑 - 更多信息: 我的最终目标是创建一个灵活的类,可以扩展任何当前的Panel类(例如Grids和StackPanels),因为它们密封了覆盖函数,我希望找到一个解决方法,用于检测添加的子代等等。
答案 0 :(得分:1)
您应该重写方法ArrangeOverride
和MeasureOverride
,这些是您进行自定义布局的地方。每当Children
成员资格发生变化时,就会出于各种原因调用它们。