3

我正在尝试创造一种情况,即ToggleButton任何时候都可以打开一组两个 s 中的一个或一个。我遇到的问题是,如果我更改支持变量的状态,UI 状态不会更新。

我确实INotifyPropertyChanged实现了。

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

        <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 模式,其他绑定工作,IE 点击ToggleButton确实进入这些属性设置。当我通过代码更改状态时,切换按钮不会改变视觉状态。IE I我将支持属性设置为 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;
        }
    }
4

2 回答 2

8

问题只是您在实际更改属性值之前提出了属性更改通知。因此,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;
    }
}

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

于 2009-09-04T12:31:40.710 回答
0

您的代码看起来不对:您在做出更改之前就通知了更改。我认为你需要移动你的 isPermFailure = value.Value; 里面:

        if (isPermFailure != value.Value)            
        {
            isPermFailure = value.Value;
            NotifyPropertyChanged("IsPermanentFailureState");
        }

另一个也是如此。

我想你也想把另一个语句移到那里:

        if (isPermFailure != value.Value)            
        {
            isPermFailure = value.Value;
            NotifyPropertyChanged("IsPermanentFailureState");
            if (isPermFailure) 
                IsTransitoryFailureState = false;
        }

否则,您将不必要地设置状态并通知该状态。

于 2009-09-04T12:31:58.773 回答