以下是我的申请概述:
它基本上是一本烹饪书。用户可以创建食谱,然后在该食谱中创建食谱。我有一堂课CookBook和一堂课。 CookBook记录了与烹饪书相关的食谱,食谱跟踪食谱的内容。
对于UI,我有一个树视图,它将显示CookBook中的食谱。我有一个TabControl,它将显示与每个配方相关的选项卡。这些选项卡由用户在运行时动态创建。
当用户点击其中一个食谱时,我希望TabControl显示与该特定食谱相关的标签。当用户点击不同的配方时,我希望前一个选择的选项卡消失,并显示当前选择的选项卡。 (旁注:为了节省目的,我将稍后将选项卡的内容和内容保存到文件中)
我希望Recipe类包含有关TabControl的详细信息(配方有多少个选项卡,每个选项卡的标题,选项卡的内容)。但我不希望Recipe负责创建Tabs或TabControl。
我的问题是,我如何完成上面的粗体部分?人们对这类问题的看法和经验是什么?这类问题的最佳做法是什么?
谢谢!
答案 0 :(得分:4)
我希望以下代码为您提供一个想法
public Form1()
{
InitializeComponent();
Recipe r1 = new Recipe() { Text = "Re1" };
Recipe r2 = new Recipe() { Text = "Re2" };
Recipe r3 = new Recipe() { Text = "Re3" };
listBox1.Items.Add(r1);
listBox1.Items.Add(r2);
listBox1.Items.Add(r3);
tabControl1.TabPages.Add(new AdvancedTabPage() { Recipe = r1,Text=r1.ToString() });
tabControl1.TabPages.Add(new AdvancedTabPage() { Recipe = r2, Text = r2.ToString() });
tabControl1.TabPages.Add(new AdvancedTabPage() { Recipe = r3, Text = r3.ToString() });
listBox1.SelectedIndexChanged += new EventHandler(listBox1_SelectedIndexChanged);
}
void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listBox1.SelectedItem != null)
foreach (AdvancedTabPage ad in tabControl1.TabPages)
{
if (ad.Recipe == listBox1.SelectedItem)
{
tabControl1.SelectedTab = ad;
break;
}
}
}
public class AdvancedTabPage : System.Windows.Forms.TabPage
{
public Recipe Recipe{get;set;}
}
public class Recipe
{
public string Text = "";
public override string ToString()
{
return Text;
}
}
答案 1 :(得分:1)
这是我假设的WinForms应用程序?您已经遇到了关注问题的经典UI分离问题。大多数开发人员解决这个问题的方式(干净利落)是通过实现类似文档/视图模型的方式。一个加载的术语归功于MFC,但仍然有用。
基本上,您的Recipe类是文档。选项卡是视图。创建一个类来处理在选项卡(或任何其他UI容器)中显示配方的任务,并使用它来处理与用户的交互。 View通常与'container'紧密耦合(在本例中就是表单本身),尽管也可以抽象出来。
最基本形式的D / V与MVC模式非常相似,但如果您的应用程序足够简单,您可以取消控制器部分。 Here是关于这个主题的一些轻松阅读。不要担心它指的是MFC,无论如何都是一样的。关于MVC的文档也可能有用,但它往往侧重于基于Web的应用程序。
有趣的东西:)
答案 2 :(得分:1)
我接近这个的一种方法是让每个Treeview的项目都引用它所代表的Recipe类。 Treeview将触发在表单上捕获的选择更改事件,您可以在其中提取Recipe实例。然后,这会将Recipe实例传递给TabControl,TabControl将根据配方信息进行自我配置。
为了实现这一点,我可能有一个派生自Treeview的自定义类和一个来自TabControl的自定义类,其中包含MyTreeview.DisplayCookBook(CookBook书籍)和MyTabControl.DisplayRecipe(食谱配方)等方法。这将在各自的容器中封装功能,并通过事件相互通信,避免使用包含1000行代码的表单。
希望能给你一些指导。