我试图了解通知如何适用于 WPF 中的附加属性。
例如,考虑 ScrollViewer.CanContentScrollProperty 属性。
假设我们有以下 ListBox
<ListBox x:Name="MainListBox"
Grid.Row="1"
ScrollViewer.CanContentScroll="False">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding CustomerID}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
而在Window代码中我们将编写如下代码
private void Button_Click_1(object sender, RoutedEventArgs e)
{
MainListBox.SetValue(ScrollViewer.CanContentScrollProperty, true);
}
执行完Button_Click_1后,ListBox会自动切换到CanContentScroll = true模式,但是ScrollViewer是如何接收到connected属性的值发生变化的信息就不清楚了。可以假设通过函数 FrameworkPropertyMetadata (PropertyChangedCallback propertyChangedCallback) ,但事实是属性 ScrollViewer.CanContentScrollProperty 并没有定义 PropertyChanged 函数。
这是该属性的声明代码。
public class ScrollViewer : ContentControl
...
public static readonly DependencyProperty CanContentScrollProperty = DependencyProperty.RegisterAttached(
nameof (CanContentScroll), typeof (bool), typeof (ScrollViewer),
(PropertyMetadata) new FrameworkPropertyMetadata(BooleanBoxes.FalseBox));
可以看出,更改的功能没有注册。
那么ScrollViewer如何知道 ScrollViewer.CanContentScrollProperty 属性已更改?