从依赖属性更改的回调中访问类对象

时间:2015-04-16 19:53:56

标签: wpf vb.net xaml dependency-properties

我在自定义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个小时的修补。时间寻求帮助!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

新手(像我一样),

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

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

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

Prop1Property 是您的媒体资源名称加上后缀属性。

&#34; Prop1&#34; 是该属性名称。

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

第二个 GetType(Window1)只是您的媒体资源所在的类。 VS进入&#34; Window1&#34;作为默认值。这可能永远不会更正,并且它与小部件中的任何其他内容都没有关联,因此您必须自己更改它。我简单地说,但这是我搞砸的地方。

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

在这种情况下,&#34; Nothing&#34; 明确指出默认值为空。 选项包括默认值,属性更改回调,CoerceValueCallback和IsValidValueCallback。所有这一切都有点超越,我的问题。我必须弄清楚我们的代码是否有效,所以如果有人有问题,请回复,我可能会添加一些信息。

如果您不熟悉依赖属性,这两个10分钟的视频。

Youtube: WPF Tutorial 21 - Dependency Properties

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