更改 TabItem 中控件的值会使 TabControl 更改索引。如何?
Changing value of control in TabItem makes TabControl change index. How?
我在包含七个 TabItem 的 WPF 项目中有一个 TabControl。
在一个 TabItem (TabA) 中,我有一个绑定到项目列表的 ComboBox。所选项目绑定到我的代码隐藏中的 属性。这很好用,我可以完美地更改 属性。
在另一个 TabItem (TabB) 中,我可以用另一种方式更改相同的 属性。 ComboBox 因此将反映新值。
问题是,当 TabA 中的 ComboBox 更改为 SelectedItem 时,由于 属性 从 TabB 更改 - OnSelectionChanged
事件以某种方式冒泡到 TabControl,并引发 TabControlSelectionChanged
事件 - 即使选项卡根本没有发生任何事情。
当我查看 TabControlSelectionChanged
事件的参数时
var selectedTab = e.AddedItems[0] as TabItem;
selectedTab 为空。
为什么会发生这种情况,我该如何防止它发生?
发生这种情况是因为 TabControl.SelectionChanged 与 ComboBox.SelectionChanged 是同一事件。
这个问题我遇到过一次。为了防止这种情况发生,我使用了这段代码:
private void myTab_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.Source is TabControl) //if this event fired from TabControl
{
if (tabItemName.IsSelected)
{
//Do what you need here.
}
}
}
您可以根据需要调整此代码。希望对你有帮助。
Evil Str已经回答了问题,但是在他的带领下,我找到了另一种方法。
在 ComboBox SelectionChanged
事件中,只是防止事件进一步冒泡。
private void ComboBoxOnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
// whatever code you want in here to handle the change of item
e.Handled = true;
}
我在包含七个 TabItem 的 WPF 项目中有一个 TabControl。
在一个 TabItem (TabA) 中,我有一个绑定到项目列表的 ComboBox。所选项目绑定到我的代码隐藏中的 属性。这很好用,我可以完美地更改 属性。
在另一个 TabItem (TabB) 中,我可以用另一种方式更改相同的 属性。 ComboBox 因此将反映新值。
问题是,当 TabA 中的 ComboBox 更改为 SelectedItem 时,由于 属性 从 TabB 更改 - OnSelectionChanged
事件以某种方式冒泡到 TabControl,并引发 TabControlSelectionChanged
事件 - 即使选项卡根本没有发生任何事情。
当我查看 TabControlSelectionChanged
事件的参数时
var selectedTab = e.AddedItems[0] as TabItem;
selectedTab 为空。
为什么会发生这种情况,我该如何防止它发生?
发生这种情况是因为 TabControl.SelectionChanged 与 ComboBox.SelectionChanged 是同一事件。
这个问题我遇到过一次。为了防止这种情况发生,我使用了这段代码:
private void myTab_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.Source is TabControl) //if this event fired from TabControl
{
if (tabItemName.IsSelected)
{
//Do what you need here.
}
}
}
您可以根据需要调整此代码。希望对你有帮助。
Evil Str已经回答了问题,但是在他的带领下,我找到了另一种方法。
在 ComboBox SelectionChanged
事件中,只是防止事件进一步冒泡。
private void ComboBoxOnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
// whatever code you want in here to handle the change of item
e.Handled = true;
}