Как изменить выбранную радиокнопку в Windows Phone 8?

Я пытаюсь реализовать локализацию в своем приложении wp8. У меня есть два переключателя (арабский и английский), когда пользователь выбирает один из переключателей, появляется всплывающее окно, в котором он уверен, что хочет изменить язык приложения, если он выбирает «ОК», тогда язык приложения меняется, но если он выбирает отмену, тогда язык не изменится, но проблема в том, что переключатель переключается, даже если пользователь нажимает отмену.

Как остановить переключение?

Вот мой код Xaml и код, который привязывается, если установлен какой-либо переключатель.

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <StackPanel Orientation="Vertical" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="20">
            <RadioButton  Content="English" Foreground="Black" FontSize="30" IsChecked="{Binding isenglishchecked,Mode=TwoWay, Source={StaticResource appSettings}}" Checked="RadioButton_Checked"/>
            <RadioButton  Content="Arabic" Foreground="Black" FontSize="30" IsChecked="{Binding isarabicchecked,Mode=TwoWay, Source={StaticResource appSettings}}" Checked="RadioButton_Checked"/>
        </StackPanel>
    </Grid>



 public bool isenglishchecked
        {
            get
            {
                return GetValueOrDefault<bool>(isenglishcheckedname, isenglishcheckedDefault);
            }
            set
            {
                var result = MessageBox.Show("This Will Change the Language of the App Do you Want to continue ?", "Language Change", MessageBoxButton.OKCancel);

                if (result == MessageBoxResult.OK)
                {
                    if (AddOrUpdateValue(isenglishcheckedname, value))
                    {
                        Save();
                        if (isenglishchecked)
                        {
                            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
                            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");

                            MainViewModel.stationnamelist = null;
                            Messenger.Default.Send<string>("mainpage", "tomainpage");
                            (Application.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
                        }

                        else
                        {
                            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("ar-AE");
                            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("ar-AE");

                            MainViewModel.stationnamelist = null;
                            Messenger.Default.Send<string>("mainpage", "tomainpage");
                            (Application.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
                        }
                    }
                }
                else
                {
                    (Application.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/Skins/SelectLanguage.xaml", UriKind.Relative));
                }
            }
        }

        public bool isarabicchecked
        {
            get
            {
                return GetValueOrDefault<bool>(isarabiccheckedname, isarabiccheckedDefault);
            }
            set
            {
                if (AddOrUpdateValue(isarabiccheckedname, value))
                {
                    Save();
                }
            }
        }

person Sandeep Chauhan    schedule 24.06.2013    source источник


Ответы (1)


Вероятно, происходит то, что уровень пользовательского интерфейса (Silverlight) в ответ на касание пользователя радостно меняет свое состояние, а затем устанавливает значение isenglishchecked или isarbicchecked. Тот факт, что значение свойства не меняется, не имеет значения — Silverlight этого не замечает. (отсутствие изменения значения свойства в ответ на вызов set является нестандартным поведением, поэтому неудивительно, что Silverlight будет вести себя подобным образом)

Вот несколько вещей, которые вы можете попробовать:

  1. В обработчике набора для обоих свойств вызовите событие PropertyChanged (в INotifyPropertyChanged) для isenglishchecked и isarabicchecked. Это заставит пользовательский интерфейс повторно запросить модель представления, чтобы она снова синхронизировалась с ней. Если отмеченные свойства не изменились, пользовательский интерфейс заметит это.
  2. Используйте встроенный ExceptionValidationRule для каждого RadioButton. , а затем создайте исключение в обработчике Set, если пользователь отменит операцию. Это может привести к тому, что значение переключателя не изменится (хорошо), но также может сделать вашу кнопку красной.
  3. Определите собственное правило проверки. Может быть лучше показать окно сообщения во время ValidationRule.Validate.
  4. Полностью откажитесь от диалогового окна подтверждения и просто немедленно измените язык. Если это была ошибка, пользователь может просто нажать другую кнопку.
person Mike Fischer    schedule 25.06.2013
comment
Спасибо за ответ, Майк, но я решил проблему только вчера ... кстати, спасибо - person Sandeep Chauhan; 26.06.2013