2015-05-16 9 views
7

से मेल नहीं खाती है, मैं एक सी # निर्भरता संपत्ति को परिवर्तित करने की कोशिश कर रहा हूं जो कॉम्बोबॉक्स में दर्ज की गई अधिकतम लंबाई को F # में सीमित करता है। कार्यक्रम एक एमवीवीएम प्रोग्राम है जो मॉडल और व्यूमोडेल के लिए एफ # और दृश्य के लिए सी # का उपयोग करता है।एफ # डिफ़ॉल्ट मूल्य में निर्भरता संपत्ति

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); 
        } 
       }; 
      } 
     } 
    } 

एफ # कोड यह है:: काम कर रहे सी # कोड यह है

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) 

समस्या मैं कर रहा हूँ कि XAML त्रुटि मैं है:

डिफ़ॉल्ट मान प्रकार संपत्ति के प्रकार से मेल नहीं खाता MaxLength

मैं क्या कर रहा हूँ एनजी?

+1

क्या आप एक स्टैक ट्रेस प्रदान कर सकते हैं? आप प्रयोग के लिए स्पष्ट रूप से डिफ़ॉल्ट मान सेट करने का भी प्रयास कर सकते हैं। 'नया यूआईप्रोपर्टी मेटाडाटा (0, ऑनमैक्स लम्बाई चेंज)); उदाहरण के लिए। ऐसा लगता है कि पैरामीटर के [त्रुटि] (http://referencesource.microsoft.com/#WindowsBase/Base/System/Windows/DependencyProperty.cs,4aed0e0929184ad0) के पल में त्रुटि होती है टाइप और प्रकार [स्वचालित रूप से जेनरेट किया गया] (http://referencesource.microsoft.com/#WindowsBase/Base/System/Windows/DependencyProperty.cs,c2c01ce10ae3e445rereferences) फ्रेमवर्क डिफ़ॉल्ट मान समानता द्वारा जो मेरे लिए स्थिर है। –

+0

कोई स्टैक ट्रेस नहीं है, मैं इसे डीबग में करने की कोशिश कर रहा हूं। मैं डिफ़ॉल्ट नहीं दे सकता क्योंकि मुझे नहीं पता कि OnMaxLength को बदलने के लिए कैसे एक propertycallback में बदल दिया गया है। मैं F # –

उत्तर

4

आप इस

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) 

की कोशिश कर सकते द्वारा अपने कोड में मुख्य अंतर यह है कि एक UIPropertyMetadata(0, PropertyChangedCallback OnMaxLengthChanged)PropertyChangedCallback में OnMaxLengthChanged परिवर्तित करता है।

लेकिन मुझे यह अजीब लगता है कि आप .Loaded की सदस्यता लेते हैं, हर बार जब आप अधिकतम मूल्य बदलते हैं। मुझे संदेह है कि आप केवल पहली बार सब्सक्राइब करना चाहते हैं?

+0

पर नया हूं, मैं इसे आजमाउंगा! मैं बस एक सी # परियोजना को एफ # में बदलने की कोशिश कर रहा था। धन्यवाद, मैं आपको बता दूंगा कि यह कैसे काम करता है –

+0

मुझे लगता है कि आपके पास जाने के दो तरीके हैं ... एक तरीका है अपनी 'कॉम्बोबॉक्स टेक्स्टबॉक्स' शैली प्रदान करना जो संलग्न 'अधिकतम लम्बाई' संपत्ति को 'टेम्पलेट बाइंडिंग' करता है। यदि आप अपने वर्तमान पैटर्न को रखना चाहते हैं तो एक अतिरिक्त संपत्ति का ट्रैक रखने के लिए एक संपत्ति पेश करना है। मैं इसे प्रदर्शित कर सकता हूं लेकिन यह एक नया सवाल आईएमओ है। – FuleSnabel

संबंधित मुद्दे