在我的代码中,我在自定义控件ValidatingTextBox中声明了以下依赖属性:
public DependencyProperty visibleText = DependencyProperty.RegisterAttached("visText", typeof(String), typeof(ValidatingTextBox));
public String visText
{
get { return theBox.Text; }
set { theBox.Text = value; }
}
但是当我尝试使用xaml
时<local:ValidatingTextBox>
<ValidatingTextBox.visibleText>
</ValidatingTextBox.visibleText>
</local:ValidatingTextBox>
它表示ValidatingTextBox中不存在这样的dependencyproperty。我究竟做错了什么?有没有更好的方法与我的自定义控件的子文本框进行交互?
答案 0 :(得分:1)
在注册方法中,您将其注册为visText
,该字段的名称与该属性本身无关。您似乎也定义了一个将像普通属性一样使用的附加属性,您应该将其定义为普通的依赖属性。
此外,您可以通过执行以下操作创建两个属性,即不带CLR包装的依赖属性和普通属性:
public String visText
{
get { return theBox.Text; }
set { theBox.Text = value; }
}
它与您的实际依赖属性的值无关,因为它永远不会访问它。除此之外,属性字段应该是静态的和只读的。
建议阅读Depedency Properties Overview,因为这非常混乱,还要看the article on creating custom dependency properties这应该是非常有用的。
解决如何与子控件交互的问题:创建(正确的)依赖项属性并绑定它们。
由于该属性已存在于该子级中,您还可以将其与AddOwner
重用:
public static readonly DependencyProperty TextProperty =
TextBox.TextProperty.AddOwner(typeof(MyControl));
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
<!-- Assuming a usercontrol rather than a custom control -->
<!-- If you have a custom control and the child controls are created in code you can do the binding there -->
<UserControl ...
Name="control">
<!-- ... -->
<TextBox Text="{Binding Text, ElementName=control}"/>
<!-- ... -->
</UserControl>