Как настроить binding внутри собственных UserControl?
Пробую создать свой кастомный контрол. Но столкнулся с тем, что в нём не работает Binding к заданному мною свойству.
У класса контрола есть свойство Text (это же не техническое имя? Его можно использовать?) Внутри контрола к нему привязан текст в TextBox
Text="{Binding Text, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
Сам класс реализует интерфейс INotifyPropertyChanged
Вот его реализация (она нормальная? Такую можно использовать?):
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChanged?.Invoke(this, e);
}
protected void SetOptions<T>(string property, ref T variable, T value)
{
variable = value;
OnPropertyChanged(new PropertyChangedEventArgs(property));
}
Покопавшись понял, что для того, что бы была возможность выполнять Binding, ужно делать через DependencyProperty (в этом случае нужен вообще INotifyPropertyChanged ?) Сделал следующее :
public static readonly DependencyProperty TextProperty;
static ConsoleTextBox()
{
TextProperty = DependencyProperty.Register(
nameof(Text),
typeof(string),
typeof(ConsoleTextBox));
}
В самом свойстве прописал вот так вот :
public string? Text
{
get { return (string)GetValue(TextProperty); }
set {
SetValue(TextProperty, value);
//SetOptions(nameof(Text), ref _text, value);//Так до этого вызывал INotifyPropertyChanged
}
}
Цепляться к нему пытаюсь вот так :
<local:ConsoleTextBox Text="{Binding Input, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
Но почему-то ничего не происходит и текст не меняется, при изменении значений Input. Хотя тут же добавил обычный TextBlock и точно так же сделал Binding, и в нём всё работает. Я что-то явно делаю не так, но не могу понять, что именно.
Тестовый проект с моими попытками реализации : https://github.com/spasskiy/ConsoleTextBoxTestProject
Из другого элемента пробую биндиться к моему
<TextBox Text="{Binding ElementName=consoleTextBox, Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
Биндинг прекрасно работает с обеих сторон и в обе стороны. А из моего контрола почему-то нет.