在WPF中使用RichTextBox访问类属性以进行数据绑定

时间:2010-10-15 09:34:33

标签: c# wpf richtextbox

我目前正在尝试将带有多个文本框的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;
  } 

}

最初,文本框中的绑定只是通过数据上下文传递并链接到Storage类。

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

然后,这将通过数据绑定自动链接到_storage.IntroFormText。为了允许RichTextBox中的双向数据绑定,使用了基于this文章中的想法的自定义实现。尝试将数据绑定链接到Storage类中的属性时出现问题。使用RichTextBox,使用以下声明:

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

然后,想法是重载相关属性的getter和setter,将以下行添加到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会自动执行),或者我是否必须为此行为编写某种被黑客攻击的替换?我想我需要重载DataEntryPage类的中的Storage.Properties类的getters / setter,以允许它正确指向DependencyProperty?

由于系统的性质,不幸的是,删除数据上下文绑定系统并不是一个真正的选择(而且我没有权限大量改变设计!)。但是,希望这可能对以前遇到过这个问题的人有意义!

1 个答案:

答案 0 :(得分:1)

如果您已经在使用将Document属性设置为DependencyProperty的控件,则无需为绑定源声明另一个控件。只有绑定目标(在本例中为Document)需要是DP。如果控件写得正确,你应该能够使用与TextBox相同的Binding,并假设该字符串的内容将为StringToXamlConverter提供适当的输入以生成FlowDocument。

我希望这不是你的实际代码,但如果是,你的DP声明(在这种情况下你不应该需要)有很多错误。 DP需要具有非常特定的格式才能使其声明正常工作。通常最好使用代码片段为您生成代码片段,尤其是如果您对所有部分之间的相互关系不是很清楚,那么就会非常清楚。