从Popup关闭TabItem

时间:2015-11-28 02:19:09

标签: c# mvvm prism

这里我使用了下面的Prism 6 Toolkit实现了一个功能性的CloseTabAction:

class CloseTabAction : TriggerAction<Button>
{
    protected override void Invoke(object parameter)
    {
        var args = parameter as RoutedEventArgs;
        if (args == null) return;

        var tabItem = FindParent<TabItem>(args.OriginalSource as DependencyObject);
        if (tabItem == null) return;

        var tabControl = FindParent<TabControl>(tabItem);
        if (tabControl == null) return;

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

        if (region.Views.Contains(tabItem.Content))
        {
            region.Remove(tabItem.Content);
        }
    }

    static T FindParent<T>(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;
        }
    }
} 

我的问题是我只想在用户选择“是”(保存到数据库并关闭)或“否”(不保存但关闭选项卡)时关闭TabItem。

我已经创建了一个自定义弹出窗口来执行此操作但是我不确定如何将其连接到CloseTabAction。怎么知道这个构象是真还是假?

这是一个粗略的想法:

    if (region.Views.Contains(tabItem.Content) && Status)
    {
            region.Remove(tabItem.Content);
    }


    public bool Status { get; set; }

    private void RaiseClosePopup()
    {
        ClosePopupRequest.Raise(new Confirmation{Title = "Confrim", Content   = "Are you sure you want to close this view?"}, r => Status = r.Confirmed);
    }

2 个答案:

答案 0 :(得分:1)

我看到你看了我的Pluralsight课程,用Prism掌握了TabControl:)

为什么不在调用“删除”之前显示对话框。如果对话框的结果有效,则继续删除,如果没有则不删除。然后,您只需要决定如何通知ViewModel操作。这可以通过多种方式完成;事件聚合器,在CloseTabAction触发器上公开属性,在触发器上公开命令。您可以决定如何做到这一点。

编辑:我实际上是一个更好的方式。只需使用您查看的ViewModel界面,查看是否可以关闭TabItem。也许使用IConfirmNavigationRequest接口或创建自己的接口。然后检查之前删除他的区域。这更容易。

答案 1 :(得分:0)

在invoke方法中,我添加了这段代码。它会检查它是否实现了我的自定义&#39; IConfrimCloseRequest&#39;接口,然后调用&#39; ConfrimCloseRequest&#39;基于该结果的方法关闭或取消。如果它没有实现接口,则无论如何都要关闭它。

        var context = new NavigationContext(region.NavigationService, null);

        if (IfImplements<IConfirmCloseRequest>(tabItem.Content,
            i => i.ConfirmCloseRequest(context, canClose =>
            {
                if (!canClose) return;
                if (region.Views.Contains(tabItem.Content))
                    region.Remove(tabItem.Content);
            }))) return;
        if (region.Views.Contains(tabItem.Content))
            region.Remove(tabItem.Content);

    private static T Implementor<T>(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;
    }

    private static bool IfImplements<T>(object content, Action<T> action) where T : class
    {
        T target = Implementor<T>(content);
        if (target == null) return false;
        action(target);
        return true;
    }

此处在我的ViewModel中,我使用方法&#39; ConfirmCloseRequest&#39;来实现我的自定义接口。关闭选项卡时将调用它。

    public void ConfirmCloseRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
    {
        ClosePopupRequest.Raise(new Confirmation { Title = "Confrim", Content = "Are you sure you want to close this view?" }, r => { continuationCallback(r.Confirmed); });
    }