2015-05-16 19 views
7

Tôi đang cố chuyển đổi Thuộc tính phụ thuộc C# giới hạn độ dài tối đa của văn bản được nhập vào ComboBox thành F #. Chương trình là một chương trình MVVM sử dụng F # cho mô hình và khung nhìn, và C# cho khung nhìn. mã C# làm việc là thế này:Thuộc tính phụ thuộc trong F # Giá trị mặc định không khớp với

public class myComboBoxProperties 
    { 
     public static int GetMaxLength(DependencyObject obj) 
     { 
      return (int)obj.GetValue(MaxLengthProperty); 
     } 

     public static void SetMaxLength(DependencyObject obj, int value) 
     { 
      obj.SetValue(MaxLengthProperty, value); 
     } 

     // Using a DependencyProperty as the backing store for MaxLength. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty MaxLengthProperty = 
      DependencyProperty.RegisterAttached("MaxLength", 
      typeof(int), 
      typeof(myComboBoxProperties), 
      new UIPropertyMetadata(OnMaxLengthChanged)); 

     private static void OnMaxLengthChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
     { 
      if (obj is ComboBox) 
      { 
       ComboBox comboBox = (ComboBox)obj; 

       comboBox.Loaded += (sender, e) => 
       { 
        TextBox textBox = comboBox.Template.FindName("PART_EditableTextBox", comboBox) as TextBox; 

        if (textBox != null) 
        { 
         textBox.SetValue(TextBox.MaxLengthProperty, args.NewValue); 
        } 
       }; 
      } 
     } 
    } 

Chiếc F # mã là thế này:

type myComboBoxProperties() = 

    static let OnMaxLengthChanged (myobj1 : DependencyObject, args : DependencyPropertyChangedEventArgs) = 

     let comboBox = myobj1 :?> ComboBox 

     comboBox.Loaded.Subscribe (fun _ -> 
            let textBox : TextBox = comboBox.Template.FindName("PART_EditableTextBox", comboBox) :?> TextBox 
            match textBox with 
            | null ->() 
            |_ -> textBox.SetValue(TextBox.MaxLengthProperty, args.NewValue)) 

    static let MaxLengthProperty = DependencyProperty.RegisterAttached("MaxLength", typeof<int>, typeof<myComboBoxProperties>, new UIPropertyMetadata(OnMaxLengthChanged)) 

    static member GetMaxLength (myobj : DependencyObject) = myobj.GetValue(MaxLengthProperty) :?> int 

    static member SetMaxLength (myobj : DependencyObject, value : int) = myobj.SetValue(MaxLengthProperty, value) 

Vấn đề tôi đang gặp là lỗi XAML tôi nhận được là:

Mặc định kiểu giá trị không khớp với loại thuộc tính MaxLength

Tôi đang làm gì ng?

+1

Bạn có thể cung cấp theo dõi ngăn xếp không? Bạn cũng có thể thử đặt giá trị mặc định một cách rõ ràng vì mục đích thử nghiệm. 'mới UIPropertyMetadata (0, OnMaxLengthChanged));' ví dụ. Dường như lỗi xảy ra tại thời điểm [kiểm tra] (http://referencesource.microsoft.com/#WindowsBase/Base/System/Windows/DependencyProperty.cs,4aed0e0929184ad0) của parameterType và loại [được tạo tự động] (http://referencesource.microsoft.com/#WindowsBase/Base/System/Windows/DependencyProperty.cs,c2c01ce10ae3e445,references) bởi khung giá trị mặc định bình đẳng là stange cho tôi. –

+0

không có dấu vết ngăn xếp, tôi đang cố gắng điều này trong gỡ lỗi. Tôi không thể đưa ra một mặc định bởi vì tôi không biết làm thế nào để thay đổi OnMaxLengthChanged thành một propertycallback. Tôi mới đến F # –

Trả lời

4

Bạn có thể thử này

open System.Windows 
open System.Windows.Controls 

type MyComboBoxProperties() = 

    static let OnMaxLengthChanged (myobj1 : DependencyObject) (args : DependencyPropertyChangedEventArgs) = 

    let comboBox = myobj1 :?> ComboBox 

    comboBox.Loaded.Add (
     fun _ -> 
     let textBox : TextBox = comboBox.Template.FindName("PART_EditableTextBox", comboBox) :?> TextBox 
     match textBox with 
     | null ->() 
     |_ -> textBox.SetValue(TextBox.MaxLengthProperty, args.NewValue) 
    ) 

    static let MaxLengthProperty = 
    DependencyProperty.RegisterAttached(
     "MaxLength", 
     typeof<int>, 
     typeof<MyComboBoxProperties>, 
     UIPropertyMetadata(0, PropertyChangedCallback OnMaxLengthChanged) 
    ) 

    static member GetMaxLength (myobj : DependencyObject) = myobj.GetValue(MaxLengthProperty) :?> int 

    static member SetMaxLength (myobj : DependencyObject, value : int) = myobj.SetValue(MaxLengthProperty, value) 

Sự khác biệt chìa khóa để mã của bạn là UIPropertyMetadata(0, PropertyChangedCallback OnMaxLengthChanged) này có thể chuyển đổi thành một OnMaxLengthChangedPropertyChangedCallback.

Nhưng thật lạ khi tôi đăng ký .Loaded ngay cả khi giá trị tối đa bạn thay đổi. Tôi nghi ngờ bạn chỉ muốn đăng ký lần đầu tiên?

+0

tôi sẽ thử điều này! Tôi chỉ cố gắng chuyển đổi một dự án C# thành f #. cảm ơn tôi sẽ cho bạn biết làm thế nào nó hoạt động –

+0

Tôi nghĩ rằng bạn có hai cách để đi về ... một cách là để cung cấp của riêng bạn 'ComboBoxTextBox' phong cách mà không một' TemplateBinding' đến thuộc tính 'MaxLength' đính kèm. Nếu bạn muốn giữ mô hình hiện tại của bạn một cách tiếp cận là giới thiệu một tài sản theo dõi trạng thái bổ sung. Tôi có thể chứng minh điều đó nhưng đó là một câu hỏi mới IMO. – FuleSnabel

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