通知如何用于附加属性

问题描述 投票:1回答:3

我试图了解通知如何在WPF中用于附加属性。

例如,考虑ScrollViewer.CanContentScrollProperty属性。

假设我们有以下列表框

<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如何接收有关已更改连接属性值的信息。可以假设通过函数FrameworkPropertyMetadata(PropertyChangedCallback属性ChangedCallback),但事实是,属性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属性已更改?

c# wpf attached-properties change-notification
3个回答
0
投票

在调用堆栈上,我们可以假定通过某种XAML触发器捕获到属性值的更改,并将其分配给ScrollContentPresenter.CanContentScrollProperty属性

enter image description here


0
投票

ScrollViewer具有ScrollViewerPresenter作为ControlTemplate的一部分。

ScrollViewerPresenter.CanContentScrollProperty绑定到ScrollViewer.CanContentScrollProperty(请参阅source)。当ScrollViewer的属性更改时,ScrollViewerPresenter的属性通过绑定

与其同步

[ScrollViewerPresenter.CanContentScrollProperty has a callbackchecks CanContentScroll inside it


-1
投票

不幸的是,我最近一次使用WPF玩了一段时间,但从我记得/发现的他们并不使用INotifyPropertyChanged。

INotifyPropertyChanged仅用于广播模型中的更改(基于您的数据)。

UI控件继承自DependencyObject类-这是其魔术性来源的一部分。另一部分是UI控件的属性使用DependencyProperty(如您附加的属性)。

[https://docs.microsoft.com/en-us/dotnet/desktop-wpf/data/data-binding-overview的一些引号:

目标属性必须是依赖项属性。大多数UIElement属性是依赖属性,大多数依赖属性除了只读的,默认情况下支持数据绑定。 (仅类型从DependencyObject派生的可以定义依赖项属性;和所有UIElement类型都从DependencyObject派生。)

要检测源更改(适用于OneWay和TwoWay绑定,source必须实现适当的属性更改通知INotifyPropertyChanged之类的机制。请参阅如何:实施属性更改通知的示例INotifyPropertyChanged实现。

然后您可以找到:

虽然未在图中显示,但应注意源对象不限于是自定义.NET对象。 WPF数据绑定支持.NET对象和XML形式的数据。至提供一些示例,您的绑定源可以是UIElement,任何列表对象,ADO.NET或Web服务对象或XmlNode包含您的XML数据。有关更多信息,请参见Binding sources overview

在“绑定源”概述中,您可以阅读INotifyCollectionChanged和INotifyPropertyChange是要实现以支持通知的接口。

对于ADO.NET对象,IBindingList是完成任务的接口。 (这将是其他记录的绑定方法)

对于CLR,您仍然需要实现InotifyCollectionChanged(它们请您参考“为绑定源实现类”一章)]

至于DependencyObject好...他们自己做。

© www.soinside.com 2019 - 2024. All rights reserved.