【问题标题】:How to DataBind WPF Slider's Thumb's DragCompleted event如何 DataBind WPF Slider 的 Thumb 的 DragCompleted 事件
【发布时间】:2016-11-28 15:49:48
【问题描述】:

我想将 DragCompleted 事件绑定到我的 ViewModel 的命令之一。我使用 Blend 尝试了以下操作,但它不起作用:

<Slider x:Name="slider" HorizontalAlignment="Left" Margin="41,147,0,0" VerticalAlignment="Top" Width="412">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Thumb.DragCompleted">
            <i:InvokeCommandAction Command="{Binding DragCompletedCommand}"></i:InvokeCommandAction>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Slider>

但这不起作用。当我使用事件的正常绑定到代码后面时,它可以工作:

<Slider x:Name="slider" Thumb.DragCompleted="slider_DragCompleted"  HorizontalAlignment="Left" Margin="41,147,0,0" VerticalAlignment="Top" Width="412"></Slider>

我尝试搜索,但奇怪的是找不到答案。

【问题讨论】:

  • 我在这里可能是错的,但我想我过去曾遇到过这种情况。因为 Thumb.DragCompleted 实际上不是 Slider 的一部分(它是附加到滑块上的),所以这个 Interaction 触发器不响应它。但是,如果您编辑滑块模板的副本,您可以将交互触发器直接粘贴到拇指上,这样就可以了。

标签: wpf xaml mvvm data-binding slider


【解决方案1】:

您可以为此编写一个附加属性,如下所示:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Input;

namespace MyTestApplication
{
    internal class SliderExtension
    {
        public static readonly DependencyProperty DragCompletedCommandProperty = DependencyProperty.RegisterAttached(
            "DragCompletedCommand",
            typeof(ICommand),
            typeof(SliderExtension),
            new PropertyMetadata(default(ICommand), OnDragCompletedCommandChanged));

        private static void OnDragCompletedCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            Slider slider = d as Slider;
            if (slider == null)
            {
                return;
            }

            if (e.NewValue is ICommand)
            {
                slider.Loaded += SliderOnLoaded;
            }
        }

        private static void SliderOnLoaded(object sender, RoutedEventArgs e)
        {
            Slider slider = sender as Slider;
            if (slider == null)
            {
                return;
            }
            slider.Loaded -= SliderOnLoaded;

            Track track = slider.Template.FindName("PART_Track", slider) as Track;
            if (track == null)
            {
                return;
            }
            track.Thumb.DragCompleted += (dragCompletedSender, dragCompletedArgs) =>
            {
                ICommand command = GetDragCompletedCommand(slider);
                command.Execute(null);
            };
        }

        public static void SetDragCompletedCommand(DependencyObject element, ICommand value)
        {
            element.SetValue(DragCompletedCommandProperty, value);
        }

        public static ICommand GetDragCompletedCommand(DependencyObject element)
        {
            return (ICommand)element.GetValue(DragCompletedCommandProperty);
        }
    }
}

然后你的 Slider-Definition 看起来像:

<Slider x:Name="slider" HorizontalAlignment="Left" Margin="41,147,0,0" VerticalAlignment="Top" Width="412" 
        extensions:SliderExtension.DragCompletedCommand="{Binding SlideCompletedCommand}"/>

extensions 是您的附加属性所在的命名空间。

在您的 ViewModel 中,您有一个名为 SlideCompletedCommand 的 ICommand-Property,它看起来像:

private ICommand slideCompletedCommand;
public ICommand SlideCompletedCommand
{
    get { return slideCompletedCommand ?? (slideCompletedCommand = new RelayCommand(p => SlideCompleted())); }
}

private void SlideCompleted()
{
    // Your slide-completed-code here
}

【讨论】:

  • 谢谢。有用。但由于 Thumb 是滑块的一部分,他们应该提供一种通过 XAML 访问它的方法。
猜你喜欢
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
相关资源
最近更新 更多