【译】为什么命名“它”为依靠特点(DependencyProperty)
当咱们创立新的类和成员时,咱们花费了许多的时刻和精力是它们尽可能的好用,好了解,好发现。一般咱们会遵从.Net结构规划攻略,尤其是会不断地研讨这个新类与其他类,未来方案等内容之间的联系。
当命名依靠特点(DependencyProperty)和依靠目标(DependencyObject)的时分也是遵从这个准则,仅仅评论怎么命名,咱们就大约花了几个小时。依靠特点(DPs)终究归结为特点核算和依靠的盯梢。特点核算并不是很特别,许多特点都是这样的,所以DP的本质特征便是依靠的盯梢,因而命名为依靠特点。
这儿有一个比如,实际上是一段示例代码,显现了几个依靠盯梢的比如:
<StackPanel DataContext="Hello, world" TextBlock.FontSize="22">
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="FontWeight" Value="Bold" />
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
</StackPanel.Resources>
<TextBlock Text="{Binding}" />
</StackPanel>
代码示例中TextBlock
的特点有不少依靠:
TextBlock.Text
依靠于绑定(Binding),而这儿的绑定(Binding)依靠于DataContext
,DataContext
是从父元素StackPanel
承继下来的,因而,TextBlock.Text
也依靠于树的形状;假如TextBlock
从StackPanel
移除,StackPanel
的值也会发生变化。TextBlock.FontSize
也依靠于树。在这儿,你能够看到它从StackPanel
承继。- 一切的
TextBlock
特点都依靠于TextBlock.style
。例如,这儿是TextBlock.FontWeight
来自款式(Style)。 - 相同的,
TextBlock.Background
也依靠款式(Style)。但在这个示例中,它在触发器(Trigger)中设置。所以TextBlock.Background
在这种情况下也取决于TextBlock.IsMouseOver
。
有时,假如编写自己的依靠特点,则需求在盯梢依靠项上做一些辅佐。当需求从头核算特点时,能够经过调用InvalidateProperty
来完成,一般是因为在CoerceValueCallback
中引用了它。
例如,这儿有一个名为Foo
的依靠特点和一个名为FooPlus1
的只读依靠特点。FooPlus1
仅仅有一个核算“Foo+1”的CoerceValueCallback
。因而,Foo
有一个PropertyChangedCallback
,当Foo
发生变化时,它会使FooPlus1
失效。
public int Foo
{
get { return (int)GetValue(FooProperty); }
set { SetValue(FooProperty, value); }
}
// Using a DependencyProperty as the backing store for Foo. This enables animation, styling, binding, etc...
public static readonly DependencyProperty FooProperty =
DependencyProperty.Register("Foo", typeof(int), typeof(Window1), new PropertyMetadata(FooChangedCallback));
static void FooChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs args)
{
// Whenever Foo changes, we need to invalidate FooPlus1, so that
// the DependencyProperty system knows to update it (call its
// CoerceValueCallback again).
(d as Window1).InvalidateProperty(Window1.FooPlus1Property);
}
public int FooPlus1
{
get { return (int)GetValue(FooPlus1Property); }
}
static readonly DependencyPropertyKey FooPlus1PropertyKey =
DependencyProperty.RegisterReadOnly("FooPlus1", typeof(int), typeof(Window1), new PropertyMetadata(0, null, CoerceFooPlus1Callback));
static readonly DependencyProperty FooPlus1Property = FooPlus1PropertyKey.DependencyProperty;
static object CoerceFooPlus1Callback(DependencyObject d, object baseValue)
{
return (d as Window1).Foo + 1;
}
原文链接:https://learn.microsoft.com/en-us/archive/blogs/mikehillberg/why-is-it-called-a-dependencyproperty