Привязка свойства IsChecked ToggleButton в WP7 - PullRequest
2 голосов
/ 12 октября 2011

У меня есть это ToggleButton в моем приложении WP7, которое я связываю со свойством в моей ViewModel.У меня также есть команда для ToggleButton, которая работает при нажатии кнопки.

На основании результата этой команды я установил свойство, связанное со свойством ToggleButton.IsChecked.Но независимо от того, что я установил для свойства, кнопка переключения живет своей жизнью и просто переключается между непроверенным и проверенным.Это ожидаемое поведение или это ошибка?

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

Есть ли какое-нибудь решение этой проблемы?

Xaml:

<ToggleButton x:Name="ToggleButton" Style="{StaticResource ToggleButtonStyle}" IsChecked="{Binding IsToggleButtonChecked}, Mode=OneWay}" Command="{Binding ToggleButtonCommand, Mode=OneWay}" CommandParameter="{Binding ToggleButtonCommandParameter}"/>

Стиль устанавливает изображение кнопки на основе состояний.Команда выполняет логику при нажатии кнопки и, как было сказано ранее, устанавливает IsToggleButtonChecked на желаемое значение.Я одновременно пробовал OneWay и TwoWay на IsChecked, но я не вижу разницы.

ViewModel:

public const string IsToggleButtonCheckedPropertyName = "IsToggleButtonChecked";

    private bool _isToggleButtonChecked;

    public bool IsToggleButtonChecked
    {
        get { return _isToggleButtonChecked; }

        set
        {
            if (_isToggleButtonChecked == value)
            {
                return;
            }

            _isToggleButtonChecked = value;

            RaisePropertyChanged(IsToggleButtonCheckedPropertyName);
        }
    }

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

Ответы [ 3 ]

1 голос
/ 12 октября 2011

Убедитесь, что ToggleButton уведомляется о любых изменениях, которые вы вносите в связанное свойство.

XAML

<ToggleButton Click="OnClicked"
              IsChecked="{Binding IsChecked, Mode=TwoWay}" />

C #

private bool _isChecked = false;
public bool IsChecked
{
  get { return _isChecked; }
  set 
  {
    if( value != _isChecked ) {
      _isChecked = value;
      NotifyPropertyChanged( "IsChecked" );
    }
  }
}

Получите вашЛогический набор IsChecked = false; в коде позади, чтобы снять отметку с кнопки.

0 голосов
/ 11 декабря 2013

Для других, которые могут задуматься о том же: я решил эту проблему, используя режим TwoWay, как сказал преторианец, но позволил ему самостоятельно изменить свое значение для нормальных сценариев.Когда я хочу, чтобы он оставался в том же состоянии, что и до того, как щелкнул по нему, я просто устанавливал привязываемое значение на требуемое значение.Кроме того, у меня есть другая переменная, которая отслеживает состояние isChecked, которое не связано.Делая это, я могу проверить и установить значение соответственно, и не испортить визуально проверенное состояние.Это работает, но это не идеальный способ сделать это.

0 голосов
/ 12 октября 2011

Не видя никакого кода, моим первым инстинктом было бы убедиться, что ViewModel реализует INotifyPropertyChanged и что установщик свойства, связанного с IsEnabled, запускает событие свойства, когда оно установлено.

using System.ComponentModel;

class MyViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private bool _enableCheckBox;
    public bool EnableCheckBox
    {
        get { return _enableCheckBox }
        set 
        {
            _enableCheckBox = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("EnableCheckBox"));
        }
    }
}
...