WPF Child определил начальное значение вложенного свойства - PullRequest
0 голосов
/ 13 ноября 2018

Я хотел бы использовать присоединенное свойство для установки свойств нескольких дочерних элементов.Только во время инициализации VisualTreeHelper.GetChildrenCount(parent) возвращает 0 дочерних элементов.

Когда связывающий текст MyText изменяется после визуализации представления, все работает должным образом.

Как можно преобразовать дочерние элементы перед рендерингом?

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);
        }
    }
}

1 Ответ

0 голосов
/ 13 ноября 2018

Ваше прикрепленное свойство установлено до добавления TextBoxes. Вы можете либо обработать событие Loaded для StackPanel и выполнить обработку в этом обработчике событий вместо того, чтобы делать это в обратном вызове измененного свойства, либо вы можете установить присоединенное свойство после TextBoxes были добавлены с использованием следующего синтаксиса элемента:

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

Порядок, в котором устанавливаются свойства, имеет значение.

...