我试图转换一个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.