如何将宽度绑定到最宽的继承者(反复出现任何孩子的任何孩子)?

时间:2015-08-11 13:44:56

标签: wpf xaml canvas data-binding

我正在使用以下语法。

<Canvas Width="{Binding ActualWidth, ElementName=Beep}">
  ...
</Canvas>

目前, Beep 是画布下最宽的控件,但不能保证保持这样。我需要将宽度绑定到最宽的画布上的任何后继者(即任何孩子的孩子,反复说话)。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

我没有测试它,但你可以尝试这样的东西。 在xaml:

<local:Converter x:Key="converter"/>
<Canvas Width="{Binding Path=Children, RelativeSource={RelativeSource Self}}" Converter="{StaticResource converter}"">

</Canvas>

转换器可能与此类似:

public class Converter:IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        UIElementCollection children=value as UIElementCollection;
        double ret=0.0;
        recursiveSearch(children, ref ret);
        return ret;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
    private void recursiveSearch(UIElementCollection children, ref double width)
    {
        if(children == null || children.Count==0) return;
        foreach(UIElement element in children)
        {
            FrameworkElement el=element as FrameworkElement;
            if(el == null) continue;
            if(el.ActualWidth>width) width=el.ActualWidth;
            Panel p=el as Panel;
            if(p!=null) recursiveSearch(p.Children, ref width);
        }
    }
}

答案 1 :(得分:-1)

尝试绑定到您感兴趣的所有控件的集合。然后编写转换器并从集合中选择最广泛的控件。

如果您没有控件集合,当然也可以使用多重绑定。