【问题标题】:Preventing TabControl selection in Silverlight防止在 Silverlight 中选择 TabControl
【发布时间】:2011-10-17 10:34:39
【问题描述】:

有什么方法可以防止 Silverlight 4 中 TabControl 中的选项卡发生变化?

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

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

我可以做些什么来阻止标签改变?

【问题讨论】:

    标签: c#-4.0 silverlight-4.0 tabcontrol


    【解决方案1】:

    将 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 事件会触发,将所选索引重新绑定到现有值。

    希望这是你想要完成的。

    更新(2012 年 11 月 10 日)- 替代方法(可能用于 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);
                }
            }
        }
    

    【讨论】:

    • 嗯,我试过了,但没有用。如果设置了相同的值,则 TabControl 似乎会忽略 OnPropertyChanged。有什么想法吗?
    • 可能在 Silverlight 4 和 5 之间进行了更改,这曾经可以工作。检查我上面更新的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2011-06-01
    • 2012-01-27
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多