我正在尝试创建一种情况,其中一个或两个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模式,其他绑定工作,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;
}
}
答案 0 :(得分: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;
}
}
顺便提一下,你说它在你使用界面而不是代码时有效,但我看不到它可能。
答案 1 :(得分: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;
}
否则你将不必要地设置状态并通知那个状态。