Merge pull request #966 from PixiEditor/fixes/11.06.2025
Fixed slider overriding value
This commit is contained in:
commit
259b51d78a
83
src/PixiEditor/Helpers/Behaviours/SliderBindingBehavior.cs
Normal file
83
src/PixiEditor/Helpers/Behaviours/SliderBindingBehavior.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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}" />
|
||||
|
Loading…
x
Reference in New Issue
Block a user