【问题标题】:Why WPF Binding does not invoke propertyChangedCallback defined in PropertyMetadata, while setter in code-behind does?为什么 WPF 绑定不调用 PropertyMetadata 中定义的 propertyChangedCallback,而代码隐藏中的 setter 呢?
【发布时间】:2012-10-16 07:02:34
【问题描述】:

我制作了一个用户控件,并在其中定义了一个依赖属性,如下所示:

public static readonly
DependencyProperty SourceProperty =
    DependencyProperty.Register(
        "Source",
        typeof( ObservableCollection<object> ),
        typeof( SingleLineChart ), 
        new PropertyMetadata(
            default( ObservableCollection<object> ),
            lineAffectedPropertyChanged ) );

我也有一个普通的属性,它包裹了上面的那个。在它的 setter 中,我只调用 SetValue( SourceProperty, value ); 方法。

当我从代码隐藏文件中设置Source 时,lineAffectedPropertyChanged 被调用并执行,一切正常;但是当我使用简单的数据绑定时,什么也没有发生。

        <Line:SingleLineChart
        Name="bestFitnessDisplayer"
        Source="{Binding Path=bestFitnessHistory}"
        Margin="20"/>

我错过了什么?

【问题讨论】:

  • 您是否遇到任何绑定错误?也许路径 bestFitnessHistory 没有找到
  • 同意杰霍夫的观点。可能绑定有问题。 bestFitnessHistory位于哪里?根据您的命名风格,我怀疑它在内部视图中。但是你的绑定需要这个集合在绑定的 DataContext 中。
  • 另外备注:通常使用集合的默认值是不好的做法 DependencyProperties:如果这样做,类的所有对象将使用相同的集合对象作为默认值,基本上共享相同的项目。但这可能与您的问题无关。
  • 不!没有绑定错误,我在父节点设置了正确的数据上下文
  • 什么是 bestFitnessHistory?它是一个字段/属性吗?并且您是否通知 SingleLineChart 每当您以某种方式创建/修改/填充此属性/字段时?或者它是一个依赖属性?我认为这里的问题是您没有在数据上下文的构造函数中分配/创建 bestFitnessHistory,但有时稍后(如果它是 CLR 属性)您需要告诉视图它已更改。

标签: c# wpf data-binding dependency-properties


【解决方案1】:

我知道已经很晚了。 我猜想绑定属性的泛型类型不是对象类型。 .Net 无法在 ObservableCollection&lt;object&gt; 和 ObservableCollection&lt;Something&gt; 类型之间进行转换。最好创建不带泛型参数的 IEnumerabe/ICollection 或 IList 类型的 DependencyProperty。

【讨论】:

    猜你喜欢
    • 2018-08-15
    • 1970-01-01
    • 2012-07-15
    • 2012-01-28
    • 2014-06-05
    • 2010-12-14
    • 2013-10-17
    • 2020-07-29
    • 1970-01-01
    相关资源
    最近更新 更多