Проблема связана с тем, что привязки оцениваются последовательно, а когда свойство Text
изменяется, это приводит к удалению всей информации выбора (это можно увидеть, поставив точки останова в обработчиках событий ModdedTextBox
). Поскольку привязки BindableSelection ... все еще активны в этой точке, это приводит к сбросу информации о выборе.
В зависимости от того, какое поведение вы хотите, возможно, есть способ обойти это, но вам нужно знать немного больше деталей ...
Редактировать в ответ на комментарии:
Это решение не точно отвечает на ваш первоначальный вопрос, и, вероятно, это не очень хорошая практика, но, по крайней мере, оно работает ...
Попробуйте изменить свой ModdedTextBox так, чтобы вместо предоставления привязываемых свойств для информации выбора, выставлялся один DP типа Repository и связывался с ним:
<local:ModdedTextBox
x:Name="textBox"
Repository="{Binding CurrentRepository}"
TextWrapping="Wrap"
/>
Затем обработайте измененное событие на вашем DP, чтобы установить свойства текстового поля:
public static DependencyProperty RepositoryProperty =
DependencyProperty.Register("Repository",
typeof(Repository), typeof(ModdedTextBox), new PropertyMetadata(null, OnRepositoryChanged));
public Repository Repository
{
get { return (Repository)base.GetValue(RepositoryProperty); }
set { base.SetValue(RepositoryProperty, value); }
}
private static void OnRepositoryChanged(DependencyObject senderObject, DependencyPropertyChangedEventArgs e)
{
var sender = (ModdedTextBox)senderObject;
var oldRepository = e.OldValue as Repository;
var newRepository = e.NewValue as Repository;
if (oldRepository != null)
{
oldRepository.Text = sender.Text;
oldRepository.SelectionStart = sender.SelectionStart;
//etc
}
if (newRepository != null)
{
sender.Text = newRepository.Text;
sender.SelectionStart = newRepository.SelectionStart;
//etc
}
}
Это по существу устраняет серийный характер оценки связывания.
Примечание: вы также можете достичь того же, используя вложенные свойства, что будет лучше, чем создание подкласса TextBox, но это ближе к вашим первоначальным попыткам, поэтому я думаю, что это легче объяснить!