请批评这种方法

时间:2010-05-23 09:18:59

标签: c# wpf tabcontrol observablecollection tabitem

您好我一直在网上寻找一些标签按钮关闭功能,但所有这些解决方案都有一些复杂的事件处理程序,我想尝试保持简单,但我可能已经破坏了良好的代码道德这样做,所以请查看此方法并告诉我出了什么问题。

   public void AddCloseItem(string header, object content){

   //Create tabitem with header and content
   StackPanel headerPanel = new StackPanel() { Orientation = Orientation.Horizontal, Height = 14};
   headerPanel.Children.Add(new TextBlock() { Text = header });
   Button closeBtn = new Button() { Content = new Image() { Source = new BitmapImage(new Uri("images/cross.png", UriKind.Relative)) }, Margin = new Thickness() { Left = 10 } };
   headerPanel.Children.Add(closeBtn);
   TabItem newTabItem = new TabItem() { Header = headerPanel, Content = content };

   //Add close button functionality
   closeBtn.Tag = newTabItem;
   closeBtn.Click += new RoutedEventHandler(closeBtn_Click);

   //Add item to list
   this.Add(newTabItem);
  }

  void closeBtn_Click(object sender, RoutedEventArgs e)
  {
   this.Remove((TabItem)((Button)sender).Tag);
  }

所以我正在做的是将tabitem存储在btn.Tag属性中,然后当单击该按钮时,我只是从我的observablecollection中删除tabitem,并且UI被适当更新。

我是否使用太多内存将tabitem保存到Tag属性?

2 个答案:

答案 0 :(得分:1)

我对WPF的了解不足以说明这是否是达到你想要的最佳方式,但我不会想到内存使用会成为一个问题。

当你这样做时

closeBtn.Tag = newTabItem;

您只在closeBtn.Tag属性中存储对newTabItem的引用。

TabItem对象在任何情况下都需要保留在内存中。

答案 1 :(得分:1)

由于您要求对代码提供反馈,我建议您查看将标签列表绑定到ObservableCollection数据项并使用DataTemplate定义每个标签的外观

看看Josh Smith的优秀MSDN article about MVVM,他有一些示例代码,可以在不触及UI代码的情况下添加和删除标签项。

至于在实际标签上有一个关闭按钮,有一个example here,它是TabItem的子类。当然,你并不是必须继承它 - 你可以重新定义标准TabItem的模板。如果你决定为你的应用程序使用MVVM设计模式(你应该),你可以将关闭按钮绑定到viewmodel中的command,它只是从前面提到的{{{{}} { 1}}。