Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UWP C#/XAML滑块值不';不兑现有约束力的支持财产_C#_Xaml_Slider_Uwp - Fatal编程技术网

UWP C#/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

我遇到了一个问题,滑块控件的值与它绑定到的backing属性的值不符。这是一个错误,还是我做错了什么

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();
        }
    }
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();
}