Доступ к свойствам классов для привязки данных с помощью RichTextBoxes в WPF - PullRequest
1 голос
/ 15 октября 2010

В настоящее время я пытаюсь преобразовать форму wpf с несколькими текстовыми полями в RichTextBoxes, чтобы улучшить функциональность редактирования.Все исходные текстовые поля были связаны с базовым классом хранения с использованием привязки данных к контексту данных при переходе на страницу.

public class Storage
{
  public String IntroFormText { get; set; }
  public String MainFormText { get; set; }
}

public partial class DataEntryPage : BasePage
{
  private Storage _storage { get; set; }

  public override NavigatingTo(object data, object savedState)
  {
    DataContext = _storage;
  } 

}

Первоначально привязки в текстовом поле просто проходили и связывались с хранилищем.Класс через контекст данных, например, так.

<TextBox
  Name="IntroText"
  Text="{Binding IntroFormText}
  SpellCheck.IsEnabled="True" />

Это будет автоматически связываться через привязку данных к _storage.IntroFormText.Чтобы разрешить двухстороннее связывание данных в RichTextBoxes, была использована пользовательская реализация, основанная на идеях этой статьи.Проблемы возникают при попытке связать привязки данных со свойствами в классе Storage.В RichTextBoxes используется следующее объявление:

<Utils:BindableRichTextBox
  x:Name="IntroductionText"
  Document="{Binding {Path=IntroFormText, ElementName=dataEntryPage, Mode=TwoWay, Converter={StaticResource StringToXamlConverter}}"
  SpellCheck.IsEnabled="True" />

Идея состоит в том, чтобы перегрузить методы получения и установки для соответствующего свойства, добавив следующие строки в класс DataEntryPage.

private static readonly DependencyProperty introProperty = DependencyProperty.Register("IntroFormText", typeof(string), typeof(Storage));

public string IntroFormText
{
  get { return (string) GetValue(DocumentProperty); }
  set { SetValue(DocumentProperty, value); }
}

Проблема, с которой я столкнулся, заключается в том, что свойство, с которым оно должно быть связано, находится в классе Storage, а НЕ в классе DataEntryPage.Есть ли способ заставить DependencyProperty эффективно связываться со свойствами класса Storage (как это делает TextBox автоматически), или мне придется написать какую-то взломанную совместную замену для этого поведения?Я предполагаю, что мне нужно перегрузить методы получения / установки для класса Storage.Properties внутри класса DataEntryPage, чтобы он мог правильно указывать на DependencyProperty?

Из-за особенностей системыУдаление системы привязки контекста данных, к сожалению, не является приемлемым вариантом (плюс у меня нет разрешения на серьезное изменение дизайна!).Надеюсь, что это может иметь смысл для тех, кто сталкивался с проблемой раньше!

1 Ответ

1 голос
/ 15 октября 2010

Если вы уже используете элемент управления, который устанавливает свойство Document в качестве DependencyProperty для вас, вам не нужно объявлять еще один для источника Binding.Только цель привязки (в данном случае Document) должна быть DP.Если элемент управления написан правильно, вы сможете использовать ту же привязку, что и в TextBox, при условии, что содержимое этой строки предоставит соответствующий ввод вашему StringToXamlConverter для создания FlowDocument.надеясь, что это не ваш настоящий код, но если это так, ваша декларация DP (которая вам не нужна в этом случае) содержит множество ошибок.ПЛ должны иметь очень специфический формат для правильной работы своих деклараций.Обычно лучше всего использовать фрагмент кода для его генерации, особенно если у вас нет четкого понимания того, как все части связаны друг с другом.

...