Проблема с DependencyProperty в пользовательском элементе управления - PullRequest
0 голосов
/ 22 июня 2011

В моем коде, который я объявил, в пользовательском элементе управления 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. Что я делаю неправильно? Есть ли лучший способ взаимодействия с дочерним текстовым полем моего пользовательского элемента управления?

1 Ответ

1 голос
/ 22 июня 2011

В методе регистрации, который вы зарегистрировали как visText, имя поля не имеет ничего общего с самим свойством.Вы также, кажется, определяете вложенное свойство, которое будет использоваться как обычное свойство, вы должны определить его как обычное свойство зависимости.

Далее вы создаете два свойства, свойство зависимости без CLR-оболочки.и обычное свойство, выполняя это:

public String visText
{
    get { return theBox.Text; }
    set { theBox.Text = value; }
}

Это не имеет никакого отношения к значению вашего фактического свойства зависимости, поскольку оно никогда не обращается к нему.Кроме того, поле свойства должно быть статическим и доступным только для чтения.

Чтение через Обзор свойств зависимости рекомендуется, так как это довольно запутанно, также ознакомьтесь с статьей о созданиипользовательские свойства зависимостей , которые должны быть весьма полезны.


Чтобы ответить на вопрос о том, как взаимодействовать с дочерними элементами управления: создайте (правильные) свойства зависимостей и свяжите их с ними.

Поскольку свойство уже существует у ребенка, вы также можете использовать его с 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>
...