我需要使用DependencyProperty
为用户控件添加一些逻辑。
我的逻辑应该改变UserControl
内的控件的属性。
我想避免构建巨大的“依赖树”,因为我有很多用户控件。我只是想在我的窗口中使用绑定(而不是在嵌套的用户控件中)。
这是我的控制:
public partial class BucketElevatorControl : UserControl
{
public BucketElevatorControl()
{
InitializeComponent();
}
public bool On
{
get
{
return (bool)GetValue(OnProperty);
}
set
{
SetValue(OnProperty, value);
}
}
// Using a DependencyProperty as the backing store for IsOn. This enables animation, styling, binding, etc...
public static readonly DependencyProperty OnProperty = DependencyProperty.Register(
"On",
typeof(bool),
typeof(BucketElevatorControl),
new PropertyMetadata(
false, PropertyChangedCallback
));
private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
// I want to do something with my UserControl child controls
}
}
问题是:如何在后面的控制代码中做一些逻辑并利用数据绑定?
我的逻辑很复杂(绘制图形,动画等)。
答案 0 :(得分:1)
您应该为要更改的属性创建CoerceValueCallbacks。那些回调设置了新值。当这个属性发生变化时,你会强迫其他属性,如下所示:
private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
dependencyObject.CoerceValue(MinReadingProperty);
dependencyObject.CoerceValue(MaxReadingProperty);
}
答案 1 :(得分:0)
我不知道你的意思是什么"依赖树",但是如果你想根据控件依赖属性的变化改变模板中的东西状态,你可以做在控件模板中使用TemplateBinding
和/或触发器。如果需要,请写value converters。您需要做的大部分工作可能都是这样做的。
如果您需要更复杂的逻辑,您还可以覆盖控件中的OnApplyTemplate()
,并调用GetTemplateChild()
以获取控件模板中的命名控件。例如,您可能要求模板在其中的某处TextBox
调用PART_FooText
;如果您从null
获得GetTemplateChild("PART_FooText") as TextBox
,则会抛出异常。如果TextBox
在那里,请执行任何您喜欢的操作:处理事件,设置属性等。如果您愿意,请保留私有字段TextBox _PART_FooText;
以便稍后在您的属性中更改它回调,其他事件或其他。