【问题标题】:How to bind a WPF hyperlink in a richtextbox to a command?如何将富文本框中的 WPF 超链接绑定到命令?
【发布时间】:2009-08-30 01:54:51
【问题描述】:

使用 MVVM 模式,如何进行动态绑定 一个 ICommand 到一个内部超链接的点击事件 富文本框?

【问题讨论】:

  • 文本是如何填充的?

标签: mvvm richtextbox hyperlink data-binding


【解决方案1】:

只需几个步骤即可到达,但您可以做到。

  1. 您必须使用可绑定的富文本框,而不是 WPF 附带的那种您无法绑定的富文本框。详情在这里:http://michaelsync.net/2009/06/09/bindable-wpf-richtext-editor-with-xamlhtml-convertor

  2. 完成后,您将拥有一个富文本编辑器,您可以将其绑定到 ViewModel 中的 FlowDocument。

  3. 创建 FlowDocument 后,在 ViewModel 中为 Hyperlink.ClickEvent 连接一个处理程序:

这是将处理程序添加到 FlowDoc 的调用

TheDocument.AddHandler(Hyperlink.ClickEvent, 
    new RoutedEventHandler(HandleHyperlinkClick));


//Here's the handler definition    
private void HandleHyperlinkClick(object sender, RoutedEventArgs args)
{
    Hyperlink link = args.Source as Hyperlink;
    //...
}

这是我见过的唯一一件事情。 FlowDocuments 有点奇怪,因为它们是一种数据类型和一种视觉元素,所以从某种意义上说,将它驻留在您的 ViewModel 中感觉不对,但这是要走的路。

【讨论】:

  • 我现在正在尝试这个,但是当我点击一个链接时没有任何反应!光标甚至没有变成一只手……有什么帮助吗?
  • 我认为您可能错过了 AddHandler 调用?我更改了格式,以便于查看。
  • 非常感谢!它有效,但是当我点击超链接时,网址显示两次!怎么了?
【解决方案2】:

您会发现很多无法使用 wpf 数据绑定的场景。在这些情况下,您可以创建一个新控件(例如,从 RichTextBox 继承)并提供缺少的依赖属性,以便您可以使用数据绑定。

但是,创建一个新控件来处理简单的场景是低效的。不禁止在 View 的代码隐藏文件中实现代码,这通常比创建新控件更有意义。

项目的 ViewModel 示例中显示了如何做到这一点的具体示例:

WPF 应用程序框架 (WAF)

http://waf.codeplex.com

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多