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}"
|
Min="{Binding Min}" Max="{Binding Max}"
|
||||||
Value="{Binding DoubleValue, Mode=TwoWay}" />
|
Value="{Binding DoubleValue, Mode=TwoWay}" />
|
||||||
|
|
||||||
<Slider Value="{Binding DoubleValue, Mode=TwoWay}"
|
<Slider
|
||||||
Margin="5, 0"
|
Margin="5, 0" Name="slider"
|
||||||
Classes.colorSlider="{Binding SliderSettings.IsColorSlider}"
|
Classes.colorSlider="{Binding SliderSettings.IsColorSlider}"
|
||||||
Minimum="{Binding Min}" Maximum="{Binding Max}">
|
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>
|
<Slider.Styles>
|
||||||
<Style Selector="Slider.colorSlider Border#TrackBackground">
|
<Style Selector="Slider.colorSlider Border#TrackBackground">
|
||||||
<Setter Property="Background" Value="{Binding SliderSettings.BackgroundBrush}" />
|
<Setter Property="Background" Value="{Binding SliderSettings.BackgroundBrush}" />
|
||||||
|
Loading…
x
Reference in New Issue
Block a user