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
之前。您可以处理 StackPanel
的 Loaded
事件并在此事件处理程序中进行处理,而不是在 属性 更改的回调中进行处理,或者您可以设置附加的 属性 在 之后使用以下元素语法添加了 TextBoxes
:
<StackPanel>
<TextBox />
<TextBox />
<TextBox />
<local:SetTextService.Text>
<Binding Path="MyText" />
</local:SetTextService.Text>
</StackPanel>
设置属性的顺序很重要。
我想使用附加的 属性 来设置多个 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
之前。您可以处理 StackPanel
的 Loaded
事件并在此事件处理程序中进行处理,而不是在 属性 更改的回调中进行处理,或者您可以设置附加的 属性 在 之后使用以下元素语法添加了 TextBoxes
:
<StackPanel>
<TextBox />
<TextBox />
<TextBox />
<local:SetTextService.Text>
<Binding Path="MyText" />
</local:SetTextService.Text>
</StackPanel>
设置属性的顺序很重要。