我正在尝试创建一种情况,其中两个 ToggleButton 的分组中的一个或没有一个可以随时打开。我遇到的问题是,如果我更改了支持变量的状态,则 UI 状态不会更新。

我确实实现了 INotifyPropertyChanged

我已经像这样创建了我的 ToggleButton :

        <ToggleButton IsChecked="{Binding Path=IsPermanentFailureState, Mode=TwoWay}"
                      HorizontalContentAlignment="Center"
                      VerticalContentAlignment="Center">
            <TextBlock TextWrapping="Wrap"
                       TextAlignment="Center">Permanent Failure</TextBlock>
        </ToggleButton>
        <ToggleButton IsChecked="{Binding Path=IsTransitoryFailureState, Mode=TwoWay}"
                      HorizontalContentAlignment="Center"
                      VerticalContentAlignment="Center">
            <TextBlock TextWrapping="Wrap"
                       TextAlignment="Center">Temporary Failure</TextBlock>
        </ToggleButton>

这是我的支持属性(我使用的是 MVVM 模式,其他绑定(bind)有效,IE 单击 ToggleButton 确实会进入这些属性设置。当我通过代码更改状态时,切换按钮不会更改视觉状态。IE我将 backing 属性设置为 false,但按钮保持选中状态。
    public bool? IsPermanentFailureState
    {
        get { return isPermFailure; }
        set
        {
            if (isPermFailure != value.Value)
            {
                NotifyPropertyChanged("IsPermanentFailureState");
            }
            isPermFailure = value.Value;
            if (isPermFailure) IsTransitoryFailureState = false;
        }
    }

    public bool? IsTransitoryFailureState
    {
        get { return isTransitoryFailureState; }
        set
        {
            if (isTransitoryFailureState != value.Value)
            {
                NotifyPropertyChanged("IsTransitoryFailureState");
            }
            isTransitoryFailureState = value.Value;
            if (isTransitoryFailureState) IsPermanentFailureState = false;
        }
    }

最佳答案

问题只是您在实际更改属性值之前引发了属性更改通知。因此,WPF 读取属性的旧值,而不是新值。改成这样:

public bool? IsPermanentFailureState
{
    get { return isPermFailure; }
    set
    {
        if (isPermFailure != value.Value)
        {
            isPermFailure = value.Value;
            NotifyPropertyChanged("IsPermanentFailureState");
        }
        if (isPermFailure) IsTransitoryFailureState = false;
    }
}

public bool? IsTransitoryFailureState
{
    get { return isTransitoryFailureState; }
    set
    {
        if (isTransitoryFailureState != value.Value)
        {
            isTransitoryFailureState = value.Value;
            NotifyPropertyChanged("IsTransitoryFailureState");
        }
        if (isTransitoryFailureState) IsPermanentFailureState = false;
    }
}

顺便说一句,你说当你使用界面而不是代码时它可以工作,但我看不出它可能。

关于WPF ToggleButton IsChecked 绑定(bind)问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1378894/

10-12 17:20