WPF - 将自定义 属性 附加到滑块

WPF - Attaching a custom property to a slider

在我的项目中,我目前正在我的代码隐藏视图中创建一个滑块,这个滑块有一个事件,用于指示它的值何时发生变化。创建滑块的地方也有这个项目需要的自定义对象。

我想将此自定义对象用作滑块的 属性(类似于 Slider 中的 TicksProperty),以便可以通过 object sender 我创建的 Slider_ValueChanged 事件的参数。这样做的原因是每次值 属性 更改时,我都可以从另一个 class(我的 ViewModel)执行现有命令,该命令使用此自定义对象作为参数。

但是,我知道无法将 属性 添加到现有 WPF 控件中,因此我决定尝试创建一个 CustomSlider class 继承自 Slider,其中 CustomObject 作为 DependencyProperty。我尝试查看一些示例并在下面创建了以下内容:

自定义滑块Class

public class CustomSlider : Slider
{
    public static readonly DependencyProperty CustomObjectProperty = DependencyProperty.RegisterAttached(
        "CustomObject",
        typeof(CustomObject),
        typeof(CustomSlider),
        new FrameworkPropertyMetadata(null)
    );

    public CustomObject GetCustomObject(UIElement element)
    {
        return element.GetValue(CustomObjectProperty) as CustomObject;
    }

    public static void SetCustomObject(UIElement element, CustomObject value)
    {
        element.SetValue(CustomObjectProperty, value);
    }
}

代码隐藏视图

else if ()
{
    Binding sliderBinding = this.CustomBinding(customObject);
    BindingOperations.SetBinding(customObject.VarElement, CustomSlider.ValueProperty, sliderBinding);

    var tempSlider = customObject.VarElement as CustomSlider;

    ///How would I call the property here?

    tempSlider.ValueChanged += this.Slider_ValueChanged;
}

private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double>e)
{
    var tempSlider = sender as CustomSlider;

    ///command stuff called here
}

如能提供有关此主题的任何帮助,我们将不胜感激。

您混淆了附加属性和派生控件的概念。在派生控件中,您将使用普通依赖项 属性,而不是附加的 属性,如下所示:

public class CustomSlider : Slider
{
    public static readonly DependencyProperty CustomObjectProperty =
        DependencyProperty.Register(
            "CustomObject",
            typeof(CustomObject),
            typeof(CustomSlider),
            new FrameworkPropertyMetadata(null));

    public CustomObject CustomObject
    {
        get { return (CustomObject)GetValue(CustomObjectProperty); }
        set { SetValue(CustomObjectProperty, value); }
    }
}

请注意,您可能还需要使用 属性 元数据注册 PropertyChangedCallback,以便在 属性 值更改时收到通知。回调看起来像这样:

private static void CustomObjectPropertyChanged(
    DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
    CustomSlider customSlider = (CustomSlider)obj;
    ...
}

现在您可以像这样简单地设置 属性:

var tempSlider = (CustomSlider)customObject.VarElement;
tempSlider.CustomObject = customObject;

或者您可以像这样设置绑定:

tempSlider.SetBinding(CustomSlider.CustomObjectProperty, sliderBinding);