防止在Silverlight中选择TabControl

时间:2011-10-17 10:34:39

标签: c#-4.0 silverlight-4.0 tabcontrol

有没有办法阻止更改Silverlight 4中TabControl中的选项卡?

一个简单的例子是当我有一个带有一些数据的表单时,我想询问用户他/她是否想要在实际更改标签之前保存这些数据。

我见过如何在WPF中执行此操作的代码示例,但在Silverlight中没有。

如何阻止标签更改?

1 个答案:

答案 0 :(得分:4)

将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>

在SET访问器中,编写代码以检查用户是否真的想要做他们想要做的事情。

public class Context : INotifyPropertyChanged
{
    int _SelectedIndex = 0;
    public int SelectedIndex
    {
        get
        {
            return _SelectedIndex;
        }
        set
        {
            MessageBoxResult result = MessageBox.Show("Do you want to save?", "Really?", MessageBoxButton.OKCancel);
            if (result == MessageBoxResult.OK)
            {
                _SelectedIndex = value;
            }
            RaisePropertyChanged("SelectedIndex");
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
}

净效应是,如果用户在对话框上选择“取消”,则私有变量永远不会更改 - PropertyChanged事件将触发,将所选索引重新绑定到现有值。

希望这是你想要完成的事情。

更新(11/10/2012) - 替代方法(可能是SL5?)。编写后面的代码以绑定TabControl的SelectionChanged事件,根据您的测试重置选项卡控件的选定项属性。

    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);
            }
        }
    }