Skip to main content

How to: Replace Standard DXRichEdit Command with a Custom Command

  • 2 minutes to read

The following example describes how to replace the built-in command with a custom one using the service substitution technique.

Create a Command Descendant

In this example, the CustomSaveDocumentCommand class is a SaveDocumentCommand descendant. It overrides the ExecuteCore method to display a message after a document has been saved.

View Example

public class CustomSaveDocumentCommand:SaveDocumentCommand {
    public CustomSaveDocumentCommand(IRichEditControl control)
        : base(control)
    {
    }
    protected override void ExecuteCore()
    {
        base.ExecuteCore();
        MessageBox.Show("Custom SaveDocument command was executed");
    }
}

Implement the IRichEditCommandFactoryService descendant. Create a CreateCommand method to generate a new custom command object used to replace the built-in command.

View Example

public class CustomRichEditCommandFactoryService : IRichEditCommandFactoryService
{
    readonly IRichEditCommandFactoryService service;
    readonly RichEditControl control;

    public CustomRichEditCommandFactoryService(RichEditControl control,
        IRichEditCommandFactoryService service) {
        Guard.ArgumentNotNull(control, "control");
        Guard.ArgumentNotNull(service, "service");
        this.control = control;
        this.service = service;
    }

    public RichEditCommand CreateCommand(RichEditCommandId id) {
        if(id == RichEditCommandId.FileSave)
            return new CustomSaveDocumentCommand(control);

        return service.CreateCommand(id);
    }
}

Substitute a Service

In the RichEditControl.Loaded event handler, create a new IRichEditCommandFactoryService descendant instance and use the RichEditControl.ReplaceService<T> method to substitute the default service with the newly created service.

void richEditControl1_Loaded(object sender, RoutedEventArgs e) {
    ReplaceRichEditCommandFactoryService(richEditControl1);
}

void ReplaceRichEditCommandFactoryService(RichEditControl control)
{
    IRichEditCommandFactoryService service = control.GetService<IRichEditCommandFactoryService>();
    control.ReplaceService<IRichEditCommandFactoryService>(new CustomRichEditCommandFactoryService(control, service));
}