Предотвращение выбора TabControl в Silverlight

#c#-4.0 #silverlight-4.0 #tabcontrol

#c #-4.0 #silverlight-4.0 #tabcontrol

Вопрос:

Есть ли какой-либо способ предотвратить изменение вкладки в TabControl в Silverlight 4?

Простой случай — это когда у меня есть форма с некоторыми данными, и я хочу спросить пользователя, хочет ли он / она сохранить эти данные перед фактическим изменением вкладки.

Я видел примеры кода о том, как это сделать в WPF, но не в Silverlight.

Что я могу сделать, чтобы остановить изменение вкладки?

Ответ №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 accessor напишите свой код, чтобы проверить, действительно ли пользователь хочет делать то, что он пытается сделать.

 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, повторно привязывающее выбранный индекс к существующему значению.

Надеюсь, это то, чего вы пытались достичь.

ОБНОВЛЕНИЕ (10.11.2012) — Альтернативный метод (возможно, для SL5?). Напишите код для привязки к событию SelectionChanged вашего TabControl, сбросьте свойство элемента управления tab для выбранного элемента на основе вашего теста.

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

Комментарии:

1. Хм, я пробовал это, но не сработало. По-видимому, TabControl игнорирует OnPropertyChanged, если установлено то же значение. Есть идеи?

2. Возможно, изменено между Silverlight 4 и 5, раньше это работало. Проверьте мое обновленное решение выше.