Closing Tab Item Confirmation
I've cleaned up my CloseTabAction class see below:

I took out the method 'Implements' because the interface is attached to my BaseViewModel so I know that every VM will have it, no need to check.

I created a new method to check if the content is dirty. Rather than putting it in my Invoke method. From there I raise my dialog and get the results back.

It still may need some work, but it's much better now.

internal class CloseTabAction : TriggerAction&lt;Button&gt;
{
    protected override void Invoke(object parameter)
    {
        var args = parameter as RoutedEventArgs;
        if (args == null) return;

        var tabItem = FindParent&lt;TabItem&gt;(args.OriginalSource as DependencyObject);
        if (tabItem == null) return;

        var tabControl = FindParent&lt;TabControl&gt;(tabItem);
        if (tabControl == null) return;

        var region = RegionManager.GetObservableRegion(tabControl).Value;
        if (region == null) return;

        var content = Implementor&lt;IRequestTabItemClose&gt;(tabItem.Content);

        if (IsDirty(content))
        {
            content?.ConfirmCloseRequest((canSave, cancel) =&gt;
            {
                if (cancel) return;
                if (canSave)
                {
                    content.SaveContent();
                    region.Remove(tabItem.Content);
                    return;
                }
                region.Remove(tabItem.Content);
            });
        }
        else
        {
            region.Remove(tabItem.Content);
        }
    }

    private static bool IsDirty(IRequestTabItemClose content)
    {
        var isContentDirty = false;

        content?.IsContentDirty(isDirty =&gt;
        {
            if (isDirty)
                isContentDirty = true;
        });
        return isContentDirty;
    }

    private static T FindParent&lt;T&gt;(DependencyObject child) where T : DependencyObject
    {
        while (true)
        {
            var parentObject = VisualTreeHelper.GetParent(child);

            if (parentObject == null) return null;

            var parent = parentObject as T;
            if (parent != null) return parent;

            child = parentObject;
        }
    }

    private static T Implementor&lt;T&gt;(object content) where T : class
    {
        T implementor = content as T;
        if (implementor != null) return implementor;

        var element = content as FrameworkElement;
        if (element != null) implementor = element.DataContext as T;
        return implementor;
    }
}