我的主窗口有一个带有许多选项卡的选项卡控件。每个选项卡都有一个用户控件。在每个用户控件中,都有一个或多个数据网格显示来自 DB 的某些数据。我不想在我的程序启动时加载所有网格的数据。我只想在首次显示用户控件时执行读取 DB 数据方法。有什么活动可以做到这一点吗?我试过 Loaded 事件。但是它是在我的应用程序启动时触发的,而不是在我单击标签页并显示用户控件时触发的。
问问题
981 次
2 回答
2
您可以将另一个事件附加到TabControl
而不是实际选项卡。使用该SelectionChanged
事件,您可以访问已删除(隐藏)和显示(活动)的选项卡。
然后,您需要在您的班级中添加一个标志以检查该选项卡是否已显示。像这样的东西应该工作。
readonly List<string> shownTabs;
public MainWindow()
{
InitializeComponent();
this.shownTabs = new List<string>();
this.tabCtrl.SelectionChanged += tabCtrl_SelectionChanged;
}
void tabCtrl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if(e.AddedItems.Count == 0)
return;
var tabItem = e.AddedItems[0] as TabItem;
if (tabItem == null)
return;
if(this.shownTabs.Contains(tabItem.Name))
return;
this.shownTabs.Add(tabItem.Name);
if (tabItem == this.tab1)
{
//TODO : tab 1 logic
}
else if (tabItem == this.tab2)
{
//TODO : tab 2 logic
}
}
请注意,我使用列表来保存对已加载选项卡的引用。同样在这种情况下,tabCtrl 事件将在 tabControl 构建时触发,因为第一个选项卡被添加到选择中。因此,您可能会发现在构造函数中添加事件处理程序是一个不好的地方,可能需要在另一个事件中。IE 加载的事件。
希望这可以帮助。
于 2013-07-31T00:51:10.777 回答
1
<Grid>
<TabControl SelectionChanged="TabControl_SelectionChanged_1">
<TabItem x:Name="tabitem1" Header="abc" />
<TabItem x:Name="tabitem2" Header="xyz"/>
</TabControl>
</Grid>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private bool tab1ItemLoaded = false;
private bool tab2ItemLoaded = false;
private void TabControl_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
{
if (tabitem1.IsSelected && !tab1ItemLoaded)
{
//load tab1 data
tab1ItemLoaded = true;
}
else if (tabitem2.IsSelected && !tab2ItemLoaded)
{
//load tab2 data
tab2ItemLoaded = true;
}
}
}
我希望这会给你一个想法。使用命令使用 MVVM 会很容易,但如果你在后面的代码中做,那么你可以尝试 TabControl 的 SelectionChanged 事件
于 2013-07-31T00:56:07.250 回答