Пользовательский элемент управления WPF - привязка свойств - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь создать UserControl, похожий на TextBox белый два разных изменения.

  1. Прежде всего новый TextBox должен отображать «PlaceholderText», если текстовое значение TextBox пусто. Мое решение для этой реализации включает в себя второй TextBox белый «PlaceholderText» как просто текстовый атрибут. Наконец я изменил видимость и фокус на другой TextBox.

  2. Когда объект Textid ValidationResult возвращает false, они отображают TextBlock белый "ErrorMessage"

Они буксируют реализации, которые уже работают и существуют. Для моего нового TextBox я скопировал все специфические свойства TextBox в свой новый элемент управления и передал их исходному TextBox.

Теперь я попытался связать свойство Text из моего нового элемента управления с объектом DependencyPropery (во ViewModel).

Моя реализация выглядит так:

Пользовательское свойство TextBox Text

public string Text
{
    get => TbSource.Text;
    set => TbSource.Text = value;
}

ViewModel propdp

public static DependencyProperty PersonProperty =
DependencyProperty.Register(nameof(Person), typeof(Person), typeof(PersonViewModel));

public Person Person
{
    get => (Person)GetValue(PersonProperty);
    set => SetValue(PersonProperty, value);
}

И мой взгляд

<customControl:NiceTextBox Grid.Row="0" Grid.Column="1" IsPlaceholderAktive="True" PlaceholderText="Enter first name" ErrorMessage="The given first name isn't valid." Text="{Binding Person.Name}" />

Теперь при реализации в View я стал следить за сообщением: enter image description here

Кто-нибудь знает, как это исправить? Я попытался изменить свое свойство Text на свойство зависимости, но затем я не могу передать ввод и вывод из TbSource.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Сделайте свой UserControl Text свойство как DependencyProperty, а свойство ViewModel как обычное свойство CLR и свяжите его.

UserControl

public string Text
{
    get { return (string)GetValue(TextProperty); }
    set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty TextProperty =
       DependencyProperty.Register("Text", typeof(string), typeof(NiceTextBox), new PropertyMetadata(string.Empty));

ViewModel

public Person Person { get; set; }

XAML

<customControl:NiceTextBox ... Text="{Binding Person.Name}" />
0 голосов
/ 29 июня 2018

Свойство Text вашего пользовательского элемента управления - свойство target - должно быть свойством зависимости, чтобы вы могли связываться с ним следующим образом в XAML:

<customControl:NiceTextBox ... Text="{Binding Person.Name}" />

Но свойство Person в модели представления - свойство источника - не должно определяться как свойство зависимости.

Итак, вы определили свойство зависимости в неправильном классе. Только свойства target должны быть определены как свойства зависимостей, чтобы вы могли связать их с каким-либо исходным свойством.

Элемент управления наследуется от класса DependencyObject, в котором определены методы GetValue и SetValue, но модель представления обычно этого не делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...