我遇到了一个问题,即 Slider 控件值不支持它绑定到的支持属性的值。 这是一个错误,还是我做错了什么?
XAML 代码:
<Slider x:Name="DefenseSlider" Width="220" StepFrequency="1"
Minimum="0"
Maximum="10"
Value="{Binding CharacterDefense, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
C# 支持代码:
public int CharacterDefense
{
get { return NewCharacter.CharacterDefense; }
set
{
CalculateCharacterPointsRemaining();
if (value <= CharacterPointsAvailable)
{
NewCharacter.CharacterDefense = value;
}
if (value > CharacterPointsAvailable)
{
NewCharacter.CharacterDefense = CharacterPointsAvailable;
}
CalculateCharacterPointsRemaining();
}
}
如果这是一个错误,有谁知道一种解决方法,以确保滑块的值不能高于支持值?
问候。。。
为了使绑定知道CharacterDefense
属性更改,您需要引发INotifyPropertyChanged
接口的PropertyChanged
事件。
set
{
CalculateCharacterPointsRemaining();
if (value <= CharacterPointsAvailable)
{
NewCharacter.CharacterDefense = value;
}
if (value > CharacterPointsAvailable)
{
NewCharacter.CharacterDefense = CharacterPointsAvailable;
}
CalculateCharacterPointsRemaining();
OnPropertyChanged();
}
但是,如果在绑定本身触发的属性资源库调用中引发该事件,则绑定将忽略该事件。要使其正常工作,您需要将事件发送到调度程序队列的末尾:
set
{
CalculateCharacterPointsRemaining();
if (value <= CharacterPointsAvailable)
{
NewCharacter.CharacterDefense = value;
}
if (value > CharacterPointsAvailable)
{
NewCharacter.CharacterDefense = CharacterPointsAvailable;
}
CalculateCharacterPointsRemaining();
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
OnPropertyChanged(nameof(CharacterDefense)));
}
Dispatcher
是 Page
类的属性,除非您从视图中传递它,否则您将无法访问它在视图模型中。虽然你可以这样做,但这通常是一个坏主意。
Slider
控件具有Maximum
属性是有原因的。如果要动态限制允许的值范围,则应添加返回 CharacterPointsAvailable
的视图模型属性。当然,每当此值更改时,都需要RaisePropertyChanged
通知绑定它应更新该值:
public int MaxCharacterDefense
{
get { return CharacterPointsAvailable; }
}
private void CharacterPointsAvailable()
{
// ... existing method logic
OnPropertyChanged(nameof(MaxCharacterDefense));
}
现在可以将滑块绑定到此属性:
<Slider x:Name="DefenseSlider" Width="220" StepFrequency="1"
Minimum="0"
Maximum="{Binding MaxCharacterDefense}"
Value="{Binding CharacterDefense, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
控件现在不再允许无效值,因此您可以简化CharacterDefense
资源库:
set
{
NewCharacter.CharacterDefense = value;
CalculateCharacterPointsRemaining();
}