UWP C#/XAML滑块值不';不兑现有约束力的支持财产
我遇到了一个问题,滑块控件的值与它绑定到的backing属性的值不符。这是一个错误,还是我做错了什么 XAML代码:UWP C#/XAML滑块值不';不兑现有约束力的支持财产,c#,xaml,slider,uwp,C#,Xaml,Slider,Uwp,我遇到了一个问题,滑块控件的值与它绑定到的backing属性的值不符。这是一个错误,还是我做错了什么 XAML代码: <Slider x:Name="DefenseSlider" Width="220" StepFrequency="1" Minimum="0" Maximum="10" Value="{Binding Ch
<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();
}
}
public int-CharacterDefense
{
获取{return NewCharacter.CharacterDefense;}
设置
{
CalculateCharacterPointsMaining();
if(值字符点可用)
{
NewCharacter.CharacterDefense=CharacterPointsAvailable;
}
CalculateCharacterPointsMaining();
}
}
如果是bug,是否有人知道解决方法,以确保滑块的值不能高于支持值
关于…要使绑定了解
CharacterDefense
属性更改,您需要引发INotifyPropertyChanged
接口的PropertyChanged
事件
set
{
CalculateCharacterPointsRemaining();
if (value <= CharacterPointsAvailable)
{
NewCharacter.CharacterDefense = value;
}
if (value > CharacterPointsAvailable)
{
NewCharacter.CharacterDefense = CharacterPointsAvailable;
}
CalculateCharacterPointsRemaining();
OnPropertyChanged();
}
现在可以将滑块绑定到此属性:
<Slider x:Name="DefenseSlider" Width="220" StepFrequency="1"
Minimum="0"
Maximum="{Binding MaxCharacterDefense}"
Value="{Binding CharacterDefense, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
要使绑定了解
CharacterDefense
属性更改,需要引发INotifyPropertyChanged
接口的PropertyChanged
事件
set
{
CalculateCharacterPointsRemaining();
if (value <= CharacterPointsAvailable)
{
NewCharacter.CharacterDefense = value;
}
if (value > CharacterPointsAvailable)
{
NewCharacter.CharacterDefense = CharacterPointsAvailable;
}
CalculateCharacterPointsRemaining();
OnPropertyChanged();
}
现在可以将滑块绑定到此属性:
<Slider x:Name="DefenseSlider" Width="220" StepFrequency="1"
Minimum="0"
Maximum="{Binding MaxCharacterDefense}"
Value="{Binding CharacterDefense, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
非常感谢你的解释。我之前设置了最大值,但遇到了一些挑战,需要创建另一个支持属性,将当前点数加上可用点数,这是我不愿意做的。但是,您的回答现在为我节省了继续使用setter进行值绑定的时间。非常感谢。有一个问题,如果我可以进一步打扰您的话……为什么将调度程序传递到VM通常是一个坏主意?@RAB将调度程序传递到视图模型会使视图模型的单元测试更加困难,并且会对特定的调度程序实现产生依赖性,从而限制代码到其他平台的可移植性。您可以通过将对dispatcher的访问包装到一个服务接口中来缓解这两个问题,该服务接口可以在每个平台上有不同的实现,并且在没有真正的dispatcher进行单元测试的情况下有一个单独的实现。不过,这会增加代码的复杂性,所以如果可能的话,我会避免使用。请允许我再次感谢您。有一些复杂的情况,因为OnPropertyChanged过早地触发了值,所以我将它们都放在自己的屏幕更新方法中并解决了问题。你的回答很有帮助!非常感谢你的解释。我之前设置了最大值,但遇到了一些挑战,需要创建另一个支持属性,将当前点数加上可用点数,这是我不愿意做的。但是,您的回答现在为我节省了继续使用setter进行值绑定的时间。非常感谢。有一个问题,如果我可以进一步打扰您的话……为什么将调度程序传递到VM通常是一个坏主意?@RAB将调度程序传递到视图模型会使视图模型的单元测试更加困难,并且会对特定的调度程序实现产生依赖性,从而限制代码到其他平台的可移植性。您可以通过将对dispatcher的访问包装到一个服务接口中来缓解这两个问题,该服务接口可以在每个平台上有不同的实现,并且在没有真正的dispatcher进行单元测试的情况下有一个单独的实现。不过,这会增加代码的复杂性,所以如果可能的话,我会避免使用。请允许我再次感谢您。有一些复杂的情况,因为OnPropertyChanged过早地触发了值,所以我将它们都放在自己的屏幕更新方法中并解决了问题。你的回答很有帮助!
set
{
NewCharacter.CharacterDefense = value;
CalculateCharacterPointsRemaining();
}