2011-10-17 68 views
2

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

一个简单的例子是当我得到一个表单的一些数据,我想问用户他/她是否想在实际改变标签前保存这些数据。

我见过如何在WPF中做到这一点,但不是在Silverlight中的代码示例。

我能做些什么来阻止标签变化?

回答

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事件火灾,重新绑定选定索引以现有的值。

希望这是你想要完成的。

UPDATE(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); 
      } 
     } 
    } 
+0

嗯,我试过,但没有奏效。如果设置了相同的值,则OnPropertyChanged似乎会被TabControl忽略。有任何想法吗? –

+0

可能在Silverlight 4和5之间进行更改,这用于工作。查看我上面的更新解决方案 –

+0

+1:替代方法在SL5中为我工作。 –