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

时间:2015-03-09 10:13:12

标签: c# wpf slider dependency-properties attached-properties

在我的项目中,我正在我的代码中创建一个滑块,在视图后面,这个滑块有一个事件,当它的值发生变化时。创建滑块的位置还具有此项目所需的自定义对象。

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

但是,我知道没有办法向现有的WPF控件添加属性,因此我决定尝试创建一个继承自CustomSlider的{​​{1}}类,其中包含{ {1}} Slider。我试过看一些例子并创建了以下内容:

CustomSlider Class

CustomObject

代码隐藏视图

DependencyProperty

对此主题的任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

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);