【问题标题】:Binding ToggleButton's IsChecked property in WP7在 WP7 中绑定 ToggleButton 的 IsChecked 属性
【发布时间】:2011-10-12 16:06:58
【问题描述】:

我在我的 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 的选中状态时都会设置此属性。

【问题讨论】:

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


【解决方案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; 以取消选中该按钮。

【讨论】:

  • 你的意思是每次我点击它时都必须设置:MyToggleButton.IsChecked = false,即在你创建的 OnClicked 事件中?
  • @kgrevehagen 不,使用绑定时不需要按名称引用 ToggleButton。只需设置绑定属性的值。因此,单击按钮后,请执行您在 Clicked 处理程序中所做的任何事情,如果失败,请将绑定属性设置为 false。
  • 是的,这就是我所做的,如果我想不选中它,我设置 Isckecked = false,如果我想检查它,我设置 IsChecked = true。但我的问题是,单击一次后它不会听绑定。当您说背后的代码时,您是指 xaml.cs 还是 ViewModel?因为 IsChecked 在 ViewModel 中。那么,点击后如何保持绑定呢?
  • @kgrevehagen 我的意思是 ViewModel。 IsChecked 所在的类是否实现了 INotifyPropertyChanged?
  • IsChecked 所在的类(ViewModel)实现了 INotifyPropertyhanged。它适用于我绑定到的其他东西,但不适用于切换按钮(除非在我单击它之前。)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 2011-06-20
      • 2011-06-25
      • 2010-12-04
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多