c# – F#中的依赖属性默认值不匹配

前端之家收集整理的这篇文章主要介绍了c# – F#中的依赖属性默认值不匹配前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图转换一个C#依赖属性,它将输入ComboBox的文本的最大长度限制为F#.该程序是一个MVVM程序,它使用F#作为模型和视图模型,使用C#作为视图.工作的C#代码是这样的:
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);
                    }
                };
            }
        }
    }

F#代码是这样的:

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错误是:

Default value type does not match type of property MaxLength

我究竟做错了什么?

解决方法

你可以试试这个
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<MyComboBoxProperties>,UIPropertyMetadata(0,PropertyChangedCallback OnMaxLengthChanged)
      )

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

  static member SetMaxLength (myobj : DependencyObject,value)

代码的主要区别在于UIPropertyMetadata(0,PropertyChangedCallback OnMaxLengthChanged)将OnMaxLengthChanged转换为PropertyChangedCallback.

但是,即使每次更改最大值,您也会订阅.Loaded.我怀疑你只想第一次订阅

猜你在找的C#相关文章