【问题标题】:Josh Smith's Article about MVVM, WPF, C#: How to close a specific tab?Josh Smith 关于 MVVM、WPF、C# 的文章:如何关闭特定选项卡?
【发布时间】:2014-05-05 19:16:41
【问题描述】:

我一直在我自己的应用程序中改编 Josh Smith 关于 C#/WPF 中的 MVVM 的示例,到目前为止,对于 C#-WPF 初学者来说相对成功。但现在还有一个障碍即将到来:

如果用户在特定选项卡上进行了任何内容更改,并且用户在该选项卡关闭按钮之后单击,则应显示一个消息框并通知/询问用户:“对选项卡内容的更改”示例-Tab" 已创建,但未保存。提示:如果关闭,任何内容更改都将丢失!您真的要关闭此选项卡吗?"如果他然后单击消息框的“确定”按钮,则应禁用/删除该选项卡,并且不应触发任何保存命令或类似的东西。如果他或者单击“取消”按钮,则应该只关闭消息框并显示源选项卡。

1) 消息框交互逻辑不是魔法。

2) 但是我怎样才能实现关闭特定选项卡?关闭选项卡时,适当的视图/视图模型在哪里注册或存放?我在所有不同的 TabViewModels 中都有一个布尔静态方法 IsContentOfTextboxesChanged,它返回 如果对一个或多个文本框进行了任何内容更改,则为 true;如果对任何文本框内容未进行任何内容更改,则为 false。

不幸的是,我不知道如何关闭特定标签! :/

【问题讨论】:

    标签: c# wpf mvvm tabs


    【解决方案1】:

    好的,我有办法了。

    更改:

    void OnWorkspacesChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null && e.NewItems.Count != 0)
            foreach (WorkspaceViewModel workspace in e.NewItems)
            {
                if (tab.GetType() == typeof(Tab01ViewModel))
                    workspace.RequestClose += this.OnWorkspaceRequestCloseTab01;
    
                if (tab.GetType() == typeof(Tab02ViewModel))
                    workspace.RequestClose += this.OnWorkspaceRequestCloseTab02;
    
                if (tab.GetType() == typeof(Tab03ViewModel))
                    workspace.RequestClose += this.OnWorkspaceRequestCloseTab03;
    
                // and so on ...
            }
    
    
        if (e.OldItems != null && e.OldItems.Count != 0)
            foreach (WorkspaceViewModel workspace in e.OldItems)
            {
                if (tab.GetType() == typeof(Tab01ViewModel))
                    workspace.RequestClose -= this.OnWorkspaceRequestCloseTab01;
    
                if (tab.GetType() == typeof(Tab02ViewModel))
                    workspace.RequestClose -= this.OnWorkspaceRequestCloseTab02;
    
                if (tab.GetType() == typeof(Tab03ViewModel))
                    workspace.RequestClose -= this.OnWorkspaceRequestCloseTab03;
    
                // and so on ...
            }
    }
    
    
    
    /// <summary>
    /// Closes and removes a tab of type Tab01ViewModel
    /// </summary>
    void OnWorkspaceRequestCloseTab01(object sender, EventArgs e)
    {
        WorkspaceViewModel workspace = sender as WorkspaceViewModel;
    
         if(Tab01ViewModel.IsContentOfTextboxesChanged) 
        {
            var result = System.Windows.Forms.MessageBox.Show(
                "Changes to the tab-content »" + Tab01ViewModel.TabTitle +
                "« were made, without setting them." + 
                "\n\nHint: If closing, any content changes will be lost!" + 
                "\n\nDo you really want to close this tab?",
                "MessageboxTitle", MessageBoxButtons.OKCancel, 
                MessageBoxIcon.Question);
    
            if (result == DialogResult.OK)
            {
                workspace.Dispose();
                this.Workspaces.Remove(workspace);
            }
        }
    
        else 
        {
            workspace.Dispose();
            this.Workspaces.Remove(workspace);
        }
    }
    
    
    
    /// <summary>
    /// Closes and removes a tab of type Tab02ViewModel
    /// </summary>
    void OnWorkspaceRequestCloseTab02(object sender, EventArgs e)
    {
        WorkspaceViewModel workspace = sender as WorkspaceViewModel;
    
         if(Tab02ViewModel.IsContentOfTextboxesChanged) 
        {
            var result = System.Windows.Forms.MessageBox.Show(
                "Changes to the tab-content »" + Tab02ViewModel.TabTitle +
                "« were made, without setting them." + 
                "\n\nHint: If closing, any content changes will be lost!" + 
                "\n\nDo you really want to close this tab?",
                "MessageboxTitle", MessageBoxButtons.OKCancel, 
                MessageBoxIcon.Question);
    
    
            if (result == DialogResult.OK)
            {
                workspace.Dispose();
                this.Workspaces.Remove(workspace);
            }
        }
    
        else 
        {
            workspace.Dispose();
            this.Workspaces.Remove(workspace);
        }
    }
    
    
    
    /// <summary>
    /// Closes and removes a tab of type Tab03ViewModel
    /// </summary>
    void OnWorkspaceRequestCloseTab03(object sender, EventArgs e)
    {
        WorkspaceViewModel workspace = sender as WorkspaceViewModel;
    
         if(Tab03ViewModel.IsContentOfTextboxesChanged) 
        {
            var result = System.Windows.Forms.MessageBox.Show(
                "Changes to the tab-content »" + Tab03ViewModel.TabTitle +
                "« were made, without setting them." + 
                "\n\nHint: If closing, any content changes will be lost!" + 
                "\n\nDo you really want to close this tab?",
                "MessageboxTitle", MessageBoxButtons.OKCancel, 
                MessageBoxIcon.Question);
    
    
            if (result == DialogResult.OK)
            {
                workspace.Dispose();
                this.Workspaces.Remove(workspace);
            }
        }
    
        else 
        {
            workspace.Dispose();
            this.Workspaces.Remove(workspace);
        }
    }
    

    【讨论】:

    • 你能提供更多的代码,什么是标签?它是如何实例化的?
    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 2010-12-19
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多