将普通属性转换为依赖属性

时间:2015-10-13 07:20:59

标签: wpf vb.net xaml dependency-properties

我有一个控件,我正在使用我的新应用程序。此控件具有常规属性。

    Public Property Value() As String
    Get
        If AutoCompleteTextBox.SearchText Is Nothing Then
            Return String.Empty
        Else
            Return AutoCompleteTextBox.SearchText.ToString.Trim
        End If
    End Get
    Set(value As String)
        AutoCompleteTextBox.SearchText = value
    End Set
End Property

编辑:

所以,经过多次尝试,我终于到了这个阶段。

    Public Shared ValueProperty As DependencyProperty = DependencyProperty.Register("Value", GetType(String), GetType(AutoCompleteBox))
Public Property Value() As String
    Get
        Return Me.GetValue(ValueProperty).ToString
    End Get
    Set(value As String)
        Me.SetValue(ValueProperty, value)
    End Set
End Property
Public Event PropertyChanged As PropertyChangedEventHandler _
        Implements INotifyPropertyChanged.PropertyChanged

这是依赖属性。此属性仍然没有约束力。输出窗口中没有显示绑定错误。

Text="{Binding RelativeSource={RelativeSource Self}, Path=Value, Mode=TwoWay}"

这是我的绑定方法。我不知道我还能做什么。至少如果出现错误,我本可以找到一些东西。没有任何错误,我只是一个没头的鸡。

4 个答案:

答案 0 :(得分:0)

请参阅以下网址了解所有依赖关系基础知识 http://www.wpftutorial.net/dependencyproperties.html

基本上,您可以通过提供FrameworkPropertyMetadata来获取依赖项属性的属性更改事件。

new FrameworkPropertyMetadata( [Default Value], 
                   OnCurrentTimePropertyChanged);

你可以在事件处理程序中取回目标控件(DependencyObject)并在那里实现你的逻辑

private static void OnCurrentTimePropertyChanged(DependencyObject source, 
    DependencyPropertyChangedEventArgs e)
{
    AutoCompleteTextBox control = source as AutoCompleteTextBox;
    string time = (string)e.NewValue;
    // Put some update logic here...
}

答案 1 :(得分:0)

在控件中声明依赖项属性是一件好事。

你可以在xaml中做一些绑定(抱歉,我没有你的XAML - 我想象)。

类似的东西:

<TextBox  x:Name="AutoCompleteTextBox" 
          Text="{Binding RelativeSource={RelativeSource=Self},Path=Value}"/>

此致

答案 2 :(得分:0)

TextBox有一个名为Text的属性。当您访问Text属性时,它将为您提供在TextBox中输入的文本。你的情况也一样。现在为什么要将其转换为DP?如果您希望将此DP绑定到其他控件,则DP将非常有用。

扩展此控件本身。制作一个新的控件并介绍这个新的DP。

虽然在要将此属性绑定到某个控件的位置使用DP。然后,根据绑定模式设置,此属性将从控件或控件更新从此DP更新。

如何进行装订:

    <TextBox x:Name="UserInput" />
    <uc:MyAutoCompleteTextBox ValueDP="{Binding Text, ElementName=UserInput, Mode=OneWay}" />

MyAutoCompleteTextBox是新控件,它从旧的AutoComplete控件扩展(继承)。

如果你想应用一些过滤逻辑或其他任何东西,你可以像这样在你的DP中应用它:

Get
    someVariable = TryCast(Me.GetValue(ValueProperty), String)
    ' apply somg logic to someVariable
    ' use your old Value property from here
    Return someVariable
End Get

网上有很多WPF Binding教程。

我建议: http://blog.scottlogic.com/2012/04/05/everything-you-wanted-to-know-about-databinding-in-wpf-silverlight-and-wp7-part-one.html

答案 3 :(得分:-1)

只需使用以下代码更改您的代码即可,

你的代码

Public Shared ReadOnly ValueProperty As DependencyProperty = DependencyProperty.Register("Value", GetType(String), GetType(AutoCompleteBox))
Public Property Value() As String
Get
    Return TryCast(Me.GetValue(ValueProperty), String)
End Get
Set(value As String)
    Me.SetValue(ValueProperty, value)
End Set
End Property

新代码

Public Shared ReadOnly ValueProperty As DependencyProperty = DependencyProperty.Register("Value", GetType(String), GetType(AutoCompleteBox))
Public Property Value() As String
Get
    If AutoCompleteTextBox.SearchText Is Nothing Then
        Return String.Empty
    Else
        Return AutoCompleteTextBox.SearchText.ToString.Trim
    End If
End Get
Set(value As String)
    AutoCompleteTextBox.SearchText = value
End Set
End Property

此DP将执行您的旧房产所做的事情。但只要考虑一下你的要求,就可以有更好的方式来编写这些东西。

由于