C# 4.0 在Silverlight中防止TabControl选择

C# 4.0 在Silverlight中防止TabControl选择,c#-4.0,silverlight-4.0,tabcontrol,C# 4.0,Silverlight 4.0,Tabcontrol,在Silverlight 4中是否有任何方法可以防止更改TabControl中的选项卡 一个简单的例子是,当我有一个包含一些数据的表单时,我想在实际更改选项卡之前询问用户是否希望保存这些数据 我看到了关于如何在WPF中实现这一点的代码示例,但没有在Silverlight中看到 如何阻止选项卡更改?将SelectedIndex绑定到数据上下文中的属性 <sdk:TabControl SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}">

在Silverlight 4中是否有任何方法可以防止更改TabControl中的选项卡

一个简单的例子是,当我有一个包含一些数据的表单时,我想在实际更改选项卡之前询问用户是否希望保存这些数据

我看到了关于如何在WPF中实现这一点的代码示例,但没有在Silverlight中看到


如何阻止选项卡更改?

将SelectedIndex绑定到数据上下文中的属性

<sdk:TabControl SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}">
    <sdk:TabItem Header="TabItem">
        <Grid Background="#FFE5E5E5"/>
    </sdk:TabItem>
    <sdk:TabItem Header="TabItem">
        <Grid Background="#FFE5E5E5"/>
    </sdk:TabItem>
</sdk:TabControl>
净效果是,如果用户在对话框中选择“取消”,则私有变量永远不会更改-PropertyChanged事件将触发,将所选索引重新绑定到现有值

希望这就是你想要实现的

更新(2012年11月10日)-替代方法(可能用于SL5?)。编写代码以绑定TabControl的SelectionChanged事件,根据测试重置tab控件的selected item属性

    private void TabControl_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        if (e.RemovedItems.Count > 0)
        {
            MessageBoxResult result = MessageBox.Show("Do you want to save?", "Really?", MessageBoxButton.OKCancel);
            if (result != MessageBoxResult.OK)
            {
                ((TabControl)sender).SelectionChanged -= new SelectionChangedEventHandler(TabControl_SelectionChanged);
                ((TabControl)sender).SelectedItem = e.RemovedItems[0];
                ((TabControl)sender).SelectionChanged += new SelectionChangedEventHandler(TabControl_SelectionChanged);
            }
        }
    }

嗯,我试过了,但没用。如果设置了相同的值,则TabControl会忽略OnPropertyChanged。有什么想法吗?可能在Silverlight 4和5之间发生了变化,这曾经奏效。检查上面我的更新解决方案。
    private void TabControl_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        if (e.RemovedItems.Count > 0)
        {
            MessageBoxResult result = MessageBox.Show("Do you want to save?", "Really?", MessageBoxButton.OKCancel);
            if (result != MessageBoxResult.OK)
            {
                ((TabControl)sender).SelectionChanged -= new SelectionChangedEventHandler(TabControl_SelectionChanged);
                ((TabControl)sender).SelectedItem = e.RemovedItems[0];
                ((TabControl)sender).SelectionChanged += new SelectionChangedEventHandler(TabControl_SelectionChanged);
            }
        }
    }