【问题标题】:Accessing the class object from the Dependancy Proprty Changed Callback从 Dependency Property Changed 回调访问类对象
【发布时间】:2015-04-16 19:53:56
【问题描述】:

我在访问自定义 WPF 控件中的标签时遇到问题。我已经实现了 PropertyChangedCallback 但从那里我无法访问该类。 该类是一个带有标签 (Name="lblDataName") 的简单控件,我想更改文本以匹配 DataName 属性。 下面是代码:

Public Class DataNameControl

Public Property DataName As String
    Get
        Return GetValue(DataNameProperty)
    End Get

    Set(ByVal value As String)
        SetValue(DataNameProperty, value)
    End Set
End Property

Public Shared ReadOnly DataNameProperty As DependencyProperty = _
                       DependencyProperty.Register("DataName", _
                       GetType(String), GetType(GraphData), _
                       New PropertyMetadata("KPI", AddressOf OnDataNameChanged))

Public Shared Function OnDataNameChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs) As String
    Dim dnc As DataNameControl = CType(d, DataNameControl)
    dnc.lblDataName.Text = e.NewValue.ToString
    '' I want to access the lable on my class right here.
    Return e.NewValue.ToString
End Function
End class

我希望在 XAML 中设置该属性会相应地更新标签,但是 nada!

 <Controls:DataNameControl DataName="BCWP" Margin="0"/>

关于如何更改属性本身有很多答案,但似乎没有一个专门回答这个问题,如果在这个问题上修修补补了 20 个小时。是时候寻求帮助了!

【问题讨论】:

  • Register 的第三个参数错误。它必须是 GetType(DataNameControl) 而不是 GetType(GraphData)。演员 CType(d, DataNameControl) 应该可以工作。但是,PropertyChangedCallback 不返回值,因此(据我了解 VB)它应该是 Sub,而不是 Function。您还应该显示 lblDataName 的声明位置以及它在 DataNameControl 中的显示方式。
  • 太棒了!!!!就是这样。我已将这部分课程从另一个课程移过来,错过了在注册中更改课程名称!谢谢吨@Clemens

标签: wpf vb.net xaml dependency-properties


【解决方案1】:

Register 方法的第三个参数错误。必须是GetType(DataNameControl) 而不是GetType(GraphData)

Public Shared ReadOnly DataNameProperty As DependencyProperty = _
    DependencyProperty.Register( _
        "DataName", GetType(String), GetType(DataNameControl), _
        New PropertyMetadata("KPI", AddressOf OnDataNameChanged))

PropertyChangedCallback 不应返回值:

Public Shared Sub OnDataNameChanged( _
    ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
    Dim dnc As DataNameControl = CType(d, DataNameControl)
    ...
End Sub

【讨论】:

  • 成功了,谢谢。我将其标记为正确,但我没有足够的声誉来分享我的爱!有信誉的人,请点赞!
【解决方案2】:

新手(比如我),

如果您阅读本文是为了寻找问题的解决方案,那么这里的主要课程是“确保您将正确的参数传递给您的财产登记。” VS 小部件将帮助您完成整个过程,但只是第一次,之后,如果您更改班级的名称,VS 不会自动更改注册中的班级 - 这是我的问题的根源。

所以一个基于 VS2013 添加的小部件代码的通用示例:

Public Shared ReadOnly Prop1Property As DependencyProperty = _
                           DependencyProperty.Register("Prop1", _
                           GetType(String), GetType(Window1), _
                           New PropertyMetadata(Nothing))

Prop1Property 是您的属性名称加上后缀属性。

“Prop1” 是该属性名称。

第一个 GetType(String) 是变量类型是您的属性的类型。 VS 默认输入字符串。

第二个 GetType(Window1) 只是您的属性所在的类。 VS 默认输入“Window1”。这可能永远不会正确,并且它没有链接到小部件中的任何其他内容,因此您必须自己更改它。我说的很简单,但这就是我搞砸的地方。

新的 PropertyMetadata 有 6 个重载,具体取决于您计划如何处理属性的值。

在这种情况下,"Nothing" 明确声明默认值是 nothing。 选项包括默认值、属性更改回调、CoerceValueCallback 和 IsValidValueCallback。所有这些都超出了我的问题。我必须弄清楚它们才能使我的代码正常工作,所以如果有人有问题,请回复,我可能会添加一些信息。

如果您是 Dependency Properties 的新手,这两个 10 分钟的视频。

Youtube: WPF Tutorial 21 - Dependency Properties

它们很简单,足以让您启动并运行。

【讨论】:

  • 小修正:默认值Nothing不代表你没有设置默认值。这意味着您明确地将 Nothing 设置为默认值,而不是完全不指定 PropertyMetadata。有一个 DependencyProperty.Register 重载只接受前三个参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 2016-06-09
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
相关资源
最近更新 更多