我有一个名为Field的自定义用户控件:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Name="LblName"/>
<TextBox Grid.Row="0" Grid.Column="1" HorizontalContentAlignment="Left" Name="TxtValue"/>
</Grid>
在CS文件中,我公开了下面的属性,它只是设置了文本框的“.text”值。
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
"Value",
typeof(string),
typeof(Field),
new PropertyMetadata(
default(string),
(source, args) => (source as Field).TxtValue.Text = (string)args.NewValue
)
);
[Category("Custom")]
public string Value
{
get
{
return (string)this.GetValue(ValueProperty);
}
set
{
this.SetValue(ValueProperty, value);
}
}
第一个问题。这是我们传播子用户控件依赖属性的正确方法,通过父用户控件进行备份,以便可以从页面xaml进行设置吗?我在网上看了一下,考虑到在编写自定义控件时这是一个相当原始的东西,没有多少。
详细介绍大局,我有客户详细信息页面,有些控件绑定到可观察集合中包含的客户对象。如果我将页面上的文本框(包含在Field控件中)的值从“xxxx”更改为“yyyy”,我总是返回“xxxx”。看起来好像在吸气剂周围出现了问题?
答案 0 :(得分:1)
这绝对是允许属性传播的正确方向的一步。
如果这是一个真正的自定义控件(从Control派生),你想要使用{TemplateBinding Value}
加上你应该也可以连接到TextBox上的TextChanged事件,在设置模板部分之后OnApplyTemplate方法。这样,你也可以让它更新你的底层TxtValue依赖属性。
如果这是UserControl,您可以使用Binding,但是您可以选择少量选项。如你所知,你的属性改变了回调函数只朝一个方向:你只设置Text值,你永远不会对它做出反应。
让我们希望那里的文件有所改进。