Выделенный текст в текстовом поле

#c# #wpf

#c# #wpf

Вопрос:

Привет, у меня есть 2 списка в сетке. Каждый listview содержит текстовое поле, и оба текстовых поля в обоих listview содержат один и тот же текст. Когда я выделяю часть текста в любом текстовом поле, другое текстовое поле также выделяет ту же часть текста.

можно ли выполнить привязку между двумя текстовыми полями в 2 разных listview?

Ответ №1:

Как пишет AngelWPF, Selection *-properties не являются свойствами зависимостей, поэтому вы не можете использовать для них привязку к данным.

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

Я не буду публиковать здесь весь пример кода (слишком много кода, и у меня его нет на этом компьютере), но вы можете сделать что-то вроде следующего:

 public class BindableSelectionTextBox : TextBox
{
  // Defines the dependency property as normal
  public static readonly DependencyProperty SelectedTextProperty = 
    DependencyProperty.RegisterAttached(SelectedText, typeof(string),    
      typeof(BindableSelectionTextBox),
      new FrameworkPropertyMetadata("", SelectedTextPropertyChanged));

  private static void SelectedTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  {
    var textBox = (TextBox)d;
    textBox.SelectedText = (string)e.NewValue;
  }

  public new string SelectedText
  {
    get { return (string)GetValue(SelectedTextProperty); }
    set 
    { 
      if(value != SelectedText) 
      {
         SetValue(SelectedTextProperty, value); 
      }
    }
   }

  public BindableSelectionTextBox()
  {
    SelectionChanged  = OnSelectionChanged;
  }

  private void OnSelectionChanged(object sender, RoutedEventArgs e)
  {
    SelectedText = base.SelectedText;
  }
}
 

Теперь вы должны повторить это для SelectionStart свойств SelectionLength и, и все должно быть готово.

Комментарии:

1. хм, а как насчет стороны xaml, как мне это сделать?

2. В Xaml вы просто используете обычную привязку данных к вашей модели представления. Привяжите оба текстовых поля к одному и тому же свойству, и вы должны быть настроены.

3. В качестве альтернативы у вас может быть два свойства, но тогда вы должны синхронизировать их вручную.

4. о, значит, обычное объявление моего xaml для текстового поля по-прежнему остается прежним? только то, что привязка будет SelectedText? извините, я очень новичок в этом деле

5. ДА. Новый класс выглядит точно так же, как и старый, вы просто заменяете свойства новыми, которые можно привязать.

Ответ №2:

К сожалению, поскольку SelectionText SelectionLength и SelectionStart не являются свойствами зависимости, два текстовых поля не могут быть двусторонне привязаны к этим свойствам.

Вам нужно будет написать присоединенное поведение, присоединить одно текстовое поле к другому и обработать TextBox.SelectionChangedEvent для обоих, а также синхронизировать другое при обработке события.