Merge pull request #966 from PixiEditor/fixes/11.06.2025

Fixed slider overriding value
This commit is contained in:
Krzysztof Krysiński 2025-06-11 13:44:03 +02:00 committed by GitHub
commit 259b51d78a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 91 additions and 2 deletions

View File

@ -0,0 +1,83 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
using Avalonia.Data;
using Avalonia.Xaml.Interactivity;
namespace PixiEditor.Helpers.Behaviours;
public class SliderBindingBehavior : Behavior<Slider>
{
public static readonly StyledProperty<bool> CanBindProperty = AvaloniaProperty.Register<SliderBindingBehavior, bool>(
nameof(CanBind));
public static readonly StyledProperty<IBinding?> ValueBindingProperty = AvaloniaProperty.Register<SliderBindingBehavior, IBinding?>(
nameof(ValueBinding));
[AssignBinding]
public IBinding? ValueBinding
{
get => GetValue(ValueBindingProperty);
set => SetValue(ValueBindingProperty, value);
}
public bool CanBind
{
get => GetValue(CanBindProperty);
set => SetValue(CanBindProperty, value);
}
static SliderBindingBehavior()
{
CanBindProperty.Changed.Subscribe(OnCanBindChanged);
ValueBindingProperty.Changed.Subscribe(OnBindingChanged);
}
protected override void OnAttached()
{
base.OnAttached();
if (AssociatedObject != null)
{
if (CanBind)
{
AssociatedObject.Bind(
RangeBase.ValueProperty,
ValueBinding);
}
}
}
private static void OnCanBindChanged(AvaloniaPropertyChangedEventArgs<bool> e)
{
if (e.Sender is SliderBindingBehavior behavior && behavior.AssociatedObject != null)
{
if (e.NewValue.Value && behavior.ValueBinding != null)
{
behavior.AssociatedObject.Bind(
RangeBase.ValueProperty,
behavior.ValueBinding);
}
else
{
behavior.AssociatedObject.ClearValue(RangeBase.ValueProperty);
}
}
}
private static void OnBindingChanged(AvaloniaPropertyChangedEventArgs<IBinding> e)
{
if (e.Sender is SliderBindingBehavior behavior && behavior.AssociatedObject != null)
{
if (behavior.CanBind && e.NewValue.Value != null)
{
behavior.AssociatedObject.Bind(
RangeBase.ValueProperty,
e.NewValue.Value);
}
else
{
behavior.AssociatedObject.ClearValue(RangeBase.ValueProperty);
}
}
}
}

View File

@ -43,10 +43,16 @@
Min="{Binding Min}" Max="{Binding Max}"
Value="{Binding DoubleValue, Mode=TwoWay}" />
<Slider Value="{Binding DoubleValue, Mode=TwoWay}"
Margin="5, 0"
<Slider
Margin="5, 0" Name="slider"
Classes.colorSlider="{Binding SliderSettings.IsColorSlider}"
Minimum="{Binding Min}" Maximum="{Binding Max}">
<Interaction.Behaviors>
<behaviours:SliderBindingBehavior
CanBind="{Binding NumberPickerMode,
Converter={converters:EnumBooleanConverter}, ConverterParameter=Slider}"
ValueBinding="{Binding DoubleValue, Mode=TwoWay}"/>
</Interaction.Behaviors>
<Slider.Styles>
<Style Selector="Slider.colorSlider Border#TrackBackground">
<Setter Property="Background" Value="{Binding SliderSettings.BackgroundBrush}" />