Предотвращение выбора TabControl в Silverlight - PullRequest
2 голосов
/ 17 октября 2011

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

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

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

Что можно сделать, чтобы запретить изменение вкладки?

1 Ответ

4 голосов
/ 17 октября 2011

Свяжите 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?). Напишите код для привязки к событию SelectionChanged вашего TabControl, сбросьте свойство выбранного элемента управления вкладки на основе вашего теста.

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