#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, раньше это работало. Проверьте мое обновленное решение выше.