繁体   English   中英

在WP7中绑定ToggleButton的IsChecked属性

[英]Binding ToggleButton's IsChecked property in WP7

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

确保对ToggleButton进行了对bound属性的任何更改的通知。

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; 在后面的代码中取消选中该按钮。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM