WPFChild定义附加属性初始值

WPF Child defined attached property initial value

我想使用附加的 属性 来设置多个 child 元素的属性。仅在初始化期间 VisualTreeHelper.GetChildrenCount(parent) returns 0 children.

在呈现视图后更改绑定 MyText 时,一切都按预期工作。

如何在渲染前迭代 children?

XAML:

<StackPanel local:SetTextService.Text="{Binding MyText}">
    <TextBox />
    <TextBox />
    <TextBox />
</StackPanel>

C#:

public class SetTextService : DependencyObject
{
    public static readonly DependencyProperty TextProperty =
                           DependencyProperty.RegisterAttached("Text", typeof(string), typeof(SetTextService),
                           new FrameworkPropertyMetadata("", new PropertyChangedCallback(TextPropertyChanged)));

    public static void SetText(UIElement element, string value)
    {
        element.SetValue(TextProperty, value);
    }

    public static string GetText(UIElement element)
    {
        return (string)element.GetValue(TextProperty);
    }

    private static void TextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        SetChildControlText(d, (string)e.NewValue);
    }

    private static void SetChildControlText(DependencyObject parent, string text)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(parent, i);
            PropertyInfo propInfo = child.GetType().GetProperty("Text");
            if (propInfo != null) propInfo.SetValue(child, text);
            SetChildControlText(child, text);
        }
    }
}

您的附件 属性 已设置 添加 TextBoxes 之前。您可以处理 StackPanelLoaded 事件并在此事件处理程序中进行处理,而不是在 属性 更改的回调中进行处理,或者您可以设置附加的 属性 之后使用以下元素语法添加了 TextBoxes

<StackPanel>
    <TextBox />
    <TextBox />
    <TextBox />
    <local:SetTextService.Text>
        <Binding Path="MyText" />
    </local:SetTextService.Text>
</StackPanel>

设置属性的顺序很重要。