WPF中的选择更改事件

时间:2013-03-27 16:15:51

标签: wpf tabcontrol selectionchanging

我正在寻找一种方法来防止WPF项目中的选择更改(Tab控件现在,但将来需要为ListBoxes,ListViews和ComboBoxes完成)。

我遇到了this thread并尝试使用标记为答案的相同技术。

在该技术中,您为选项卡控件的项检索CollectionView并处理CollectionView's CurrentChanging event以防止选择发生。

出于某种原因,我的代码中永远不会触发CurrentChanging事件。

这是我正在使用的非常简单的用户控件。 它有一个带有3个标签的标签控件。

(XAML)

<UserControl x:Class="UserControlWithTabs"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">

    <TabControl x:Name="MainTabControl">
       <TabItem Header="First Tab">Content for the first tab</TabItem>
       <TabItem Header="Second Tab">Content for the second tab</TabItem>
       <TabItem Header="Third Tab">Content for the third tab</TabItem>
     </TabControl>
</UserControl>

在用于用户控件的VB.NET代码中,我只是为选项卡控件的项检索CollectionView,并使用AddHandler方法来监视事件。

(VB.NET)

Public Class UserControlWithTabs
  Private WithEvents mainTabCollectionView As CollectionView
  Private Sub UserControlWithTabs_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    mainTabCollectionView = CollectionViewSource.GetDefaultView(MainTabControl.Items)
    AddHandler mainTabCollectionView.CurrentChanging, AddressOf MainTabControl_ItemSelecting
  End Sub

  Private Sub MainTabControl_ItemSelecting(ByVal sender As Object, ByVal e As System.ComponentModel.CurrentChangingEventArgs)

  End Sub
End Class

我在MainTabControl_ItemSelecting方法上设置了一个断点,但它永远不会被击中。

我做错了什么?

谢谢,

-Frinny

2 个答案:

答案 0 :(得分:1)

您是否尝试将IsSynchronizedWithCurrentItem="True"添加到TabControl

答案 1 :(得分:0)

由于问题和答案,我能够在c#中做到这一点。 因此,对于需要使用c#代码隐藏此类内容的任何人,请按照以下方式进行操作:

    mytab.IsSynchronizedWithCurrentItem = true; 
    mytab.Items.CurrentChanging += new CurrentChangingEventHandler(Items_CurrentChanging); 

    private void Items_CurrentChanging(object sender, CurrentChangingEventArgs e)
    {
        if (e.IsCancelable)
        {
            FrameworkElement elemfrom = ((ICollectionView)sender).CurrentItem as FrameworkElement;
            FrameworkElement elemto = mytab.SelectedItem as FrameworkElement; 
        }
        Console.WriteLine("tab is changing."); 
    }