自定义控件中的DependencyProperty问题

时间:2011-06-21 23:43:19

标签: c# wpf xaml custom-controls dependency-properties

在我的代码中,我在自定义控件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。我究竟做错了什么?有没有更好的方法与我的自定义控件的子文本框进行交互?

1 个答案:

答案 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>