在WP7中绑定ToggleButton的IsChecked属性

时间:2011-10-12 16:06:58

标签: c# .net windows-phone-7 windows-phone-7.1 togglebutton

我的WP7应用程序中有ToggleButton,我将其绑定到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设置为所需的值。我在IsChecked上都尝试了OneWay和TwoWay,但我看不出它们的区别。

视图模型:

public const string IsToggleButtonCheckedPropertyName = "IsToggleButtonChecked";

    private bool _isToggleButtonChecked;

    public bool IsToggleButtonChecked
    {
        get { return _isToggleButtonChecked; }

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

            _isToggleButtonChecked = value;

            RaisePropertyChanged(IsToggleButtonCheckedPropertyName);
        }
    }

每次我想要更改ToggleButton的选中状态时,都会设置此属性。

3 个答案:

答案 0 :(得分:1)

确保通知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;取消选中按钮。

答案 1 :(得分:0)

在没有看到任何代码的情况下,我的第一直觉是验证ViewModel是否实现了INotifyPropertyChanged,并且绑定到IsEnabled的属性的setter在设置时触发了属性更改事件。

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

答案 2 :(得分:0)

对于其他可能想知道相同的人:我通过使用TwoWay模式解决了这个问题,正如Praetorian所说,但是让它在正常情况下自行改变它的价值。我希望它保持与我点击它之前相同的状态,我只是将可绑定值设置为所需的值。另外,我有另一个变量来跟踪未绑定的isChecked状态。通过这样做,我可以相应地检查和设置值,并且不会弄乱视觉检查状态。这有效,但它不是一个完美的方法。