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);
在我的项目中,我目前正在我的代码隐藏视图中创建一个滑块,这个滑块有一个事件,用于指示它的值何时发生变化。创建滑块的地方也有这个项目需要的自定义对象。
我想将此自定义对象用作滑块的 属性(类似于 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);