2015-10-13 16 views
5

Tôi có quyền kiểm soát mà tôi đang sử dụng cho đơn đăng ký mới của mình. Kiểm soát này có một tài sản thường xuyên như vậy.Chuyển đổi thuộc tính thông thường sang thuộc tính phụ thuộc

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 

Edit:

Vì vậy, sau nhiều lần cố gắng, tôi cuối cùng đã ở giai đoạn này.

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 

Đây là thuộc tính phụ thuộc. Tài sản này vẫn không ràng buộc. Không có lỗi nào được hiển thị trong cửa sổ đầu ra để ràng buộc.

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

Đây là phương pháp ràng buộc của tôi. Tôi không biết tôi có thể làm gì khác. Ít nhất là nếu có lỗi, tôi có thể đã tìm ra điều gì đó. Không có lỗi, tôi chỉ là một con gà không đầu ở đây.

+0

Tôi không nhận thấy dòng đầu tiên của câu hỏi của bạn. Đã cập nhật câu trả lời của tôi. – AnjumSKhan

+0

@jitendragarg Bạn sẽ có thể hiểu được cú pháp C# và dịch thành VB? – Ilan

+0

Chắc chắn. Điều đó cũng hoạt động. – jitendragarg

Trả lời

0

Vui lòng tham khảo url sau cho tất cả các nguyên tắc cơ bản phụ thuộc http://www.wpftutorial.net/dependencyproperties.html

Về cơ bản, bạn có thể nhận được một tài sản sự kiện thay đổi của tài sản phụ thuộc bằng cách cung cấp một FrameworkPropertyMetadata.

new FrameworkPropertyMetadata([Default Value], 
        OnCurrentTimePropertyChanged); 

Và bạn có thể lấy lại sự kiểm soát mục tiêu (DependencyObject) tại xử lý sự kiện và thực hiện logic của bạn đằng kia

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

Tuyên bố một tài sản phụ thuộc vào một điều khiển là một điều tốt.

Bạn có thể thực hiện một số ràng buộc trong xaml (xin lỗi tôi không có XAML của bạn - tôi tưởng tượng).

Cái gì như:

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

Trân

0

TextBox có một tài sản gọi là Text. Khi bạn truy cập thuộc tính Text, nó sẽ cho bạn văn bản được nhập trong TextBox. Tương tự là trường hợp của bạn. Bây giờ tại sao bạn muốn chuyển đổi nó thành một DP? Một DP sẽ hữu ích nếu bạn muốn o liên kết DP này với một số điều khiển khác.

Mở rộng kiểm soát này. Tạo một điều khiển mới và giới thiệu DP mới này.

Khi DP được sử dụng nơi bạn muốn ràng buộc thuộc tính này với một số điều khiển. Tài sản này sau đó được cập nhật từ kiểm soát hoặc điều khiển được cập nhật từ DP này tùy thuộc vào chế độ ràng buộc thiết lập.

Làm thế nào để làm ràng buộc:

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

MyAutoCompleteTextBox là điều khiển mới mà mở rộng (kế thừa) từ kiểm soát AutoComplete cũ của bạn.

Nếu bạn muốn áp dụng một số logic lọc hay bất cứ điều gì khác, bạn có thể áp dụng nó trong DP bạn thân như thế này:

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

Có rất nhiều WPF Binding hướng dẫn trên mạng.

Tôi khuyên bạn nên: http://blog.scottlogic.com/2012/04/05/everything-you-wanted-to-know-about-databinding-in-wpf-silverlight-and-wp7-part-one.html

+0

Ok, do đó, vấn đề là, tôi phải ràng buộc điều khiển này với một datatable. Mã hiện tại sử dụng .Giá trị hàng triệu địa điểm. Vì vậy, tôi không thể thay đổi mã đó. Tất cả những gì tôi có thể làm là tạo một thuộc tính phụ thuộc mới cập nhật thuộc tính này. Bằng cách này tôi có thể sử dụng thuộc tính phụ thuộc mới trong mã của tôi, trong khi mã cũ sẽ hoạt động như cũ. Đó là lý do tại sao tôi đang cố tạo thuộc tính phụ thuộc mới, hãy gọi ValueDP đó. Hiện tại, .Giá trị trả lại không có gì. Tôi không biết tại sao. Và tôi không thể sử dụng ValueDP để gắn kết. – jitendragarg

+0

Việc ràng buộc chỉ có thể thực hiện với DependencyObjects. Mục tiêu của đối tượng phải là đối tượng phụ thuộc. Nguồn có thể là thuộc tính bình thường, nhưng nguồn không thể nhắm mục tiêu nếu thuộc tính nguồn không phải là DP. http://blogs.msdn.com/b/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx – AnjumSKhan

+0

@jitendragarg tôi không biết bạn đang sử dụng điều khiển này như thế nào. – AnjumSKhan

-1

Chỉ cần thay đổi mã của bạn với mã sau đây và bạn sẽ được tốt

mã của bạn

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 

Code mới

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 này sẽ làm những gì tài sản cũ của bạn đã làm ing. Nhưng chỉ cần suy nghĩ về yêu cầu của bạn có thể có một cách tốt hơn để viết những điều.

Cảm ơn

Các vấn đề liên quan