在WP7中绑定togglebutton的IsChecked属性

本文关键字:IsChecked 属性 togglebutton 绑定 WP7 | 更新日期: 2023-09-27 18:11:00

我有这个ToggleButton在我的WP7应用程序,我绑定到我的ViewModel属性。我也有一个命令,以ToggleButton的工作时,点击按钮。

根据该命令的结果,我设置了绑定到ToggleButton.IsChecked属性的属性。但无论我将属性设置为什么,切换按钮都有自己的生命周期,只是在未选中和已选中之间切换。这是预期的行为还是这是一个bug?

似乎切换按钮失去了它的绑定时,点击它,这是真的吗?我想要它绑定的原因是,我不总是想要改变检查状态,因为我的命令中的逻辑可能会失败,例如,网络关闭,所以它不能设置我想要的后端,等等。

有解决这个问题的方法吗?

Xaml:

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

样式根据状态设置按钮的图像。该命令在单击按钮时执行逻辑操作,如前所述,将IsToggleButtonChecked设置为所需值。我在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);
        }
    }

每次我想要更改ToggleButton的复选状态时设置此属性。

在WP7中绑定togglebutton的IsChecked属性

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

在没有看到任何代码的情况下,我的第一直觉将是验证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"));
        }
    }
}

对于其他可能想知道相同问题的人:我通过使用禁卫军所说的双向模式来解决这个问题,但让它在正常情况下自行改变其值。当我想让它保持与点击之前相同的状态时,我只需将可绑定值设置为所需值。此外,我还有另一个变量,它跟踪未绑定的isChecked状态。通过这样做,我可以相应地检查和设置值,而不会弄乱视觉检查状态。