UWP C# / XAML 滑块值不支持绑定的支持属性



我遇到了一个问题,即 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)));
}

DispatcherPage 类的属性,除非您从视图中传递它,否则您将无法访问它在视图模型中。虽然你可以这样做,但这通常是一个坏主意

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

最新更新