我有一个带有8个tabitems的tabcontrol,里面有很多datagrids和listbox。 我只想在选择一个特定的tabitem时启动一个事件。
第一种方法是tabcontrol中的SelectionChanged,其中包含if语句
If ((thetabiwant!=null)&& (thetabiwant.IsSelected))
{
//code here
}
第二种方法是在所需的tabitem中有一个mouseup事件。
最好的方法是什么?
(起伏是因为数据网格,所以SelectionChanged会一直触发,而mouseup事件解决方案并不能让我满意)
感谢。
答案 0 :(得分:0)
一般情况下,您不应过于担心因为与您的条件不符而跳过的事件。框架本身就是很多,你最终也会做很多事情(比如在收听INotifyPropertyChanged
事件时)。
在您的情况下,被解雇的少数额外SelectionChanged
事件实际上可以忽略不计。每个事件都要求用户实际更改选项卡,这种情况不会经常发生。另一方面,一旦你在你关心的标签中,实际上发生了很多鼠标事件。并不是说你需要关心它们的数量(除非你遇到问题,否则你真的不应该这样做)但当然你可以避免它。
所以在这种情况下,是的,只是跳过SelectionChanged
事件是最好的方法。
答案 1 :(得分:0)
您还可以绑定IsSelected属性
在集合中执行更改为true时需要执行的操作
<TabControl Grid.Row="0">
<TabItem Header="One" IsSelected="{Binding Path=Tab1Selected, Mode=TwoWay}"/>
<TabItem Header="Two" IsSelected="{Binding Path=Tab2Selected, Mode=TwoWay}"/>
</TabControl>
private bool tab1Selected = true;
private bool tab2Selected = false;
public bool Tab1Selected
{
get { return tab1Selected; }
set
{
if (tab1Selected == value) return;
tab1Selected = value;
NotifyPropertyChanged("Tab1Selected");
}
}
public bool Tab2Selected
{
get { return tab2Selected; }
set
{
if (tab2Selected == value) return;
tab2Selected = value;
if (tab2Selected)
{
MessageBox.Show("Tab2Selected");
// do your stuff here
}
NotifyPropertyChanged("Tab2Selected");
}
}