views:

624

answers:

2

With the MVVM pattern, how does one go about dynamically binding an ICommand to the click event of a hyperlink inside of a RichTextBox?

+2  A: 

It's a few steps to get there, but you can do it.

  1. You have to use a bindable rich text box, rather than the one that comes with WPF which is not something you can bind. Details here: http://michaelsync.net/2009/06/09/bindable-wpf-richtext-editor-with-xamlhtml-convertor

  2. Once you have that, you'll have a Rich Text Editor that you can bind to a FlowDocument in your ViewModel.

  3. When your FlowDocument is created, hookup a handler for the Hyperlink.ClickEvent in your ViewModel:

Here's the call that adds the handler to the 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;
    //...
}

This is the only thing I've ever seen done. FlowDocuments are a little strange because they are sort of a data type and sort of a visual element so in some sense it feels wrong to have it reside in your ViewModel, but this is the way to go.

Anderson Imes
I am trying this now, but nothing happens when i click a link! The cursor does not even change to a hand... any help?
bluebit
I think you might be missing the AddHandler call? I changed the formatting so it's easier to see.
Anderson Imes
A: 

You find a lot scenarios where it is not possible to use wpf data binding. In these scenarios you can create a new control (e.g. inherit from RichTextBox) and provide the missing dependency properties so you can use data binding.

However, creating a new control to handle simple scenarios is inefficient. It's not forbidden to implement code in the View's code behind file and this makes often more sense than creating a new control.

A concrete example how this can be done is shown in the ViewModel sample of the project:

WPF Application Framework (WAF)

http://waf.codeplex.com

jbe