我试图转换一个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.我怀疑你只想第一次订阅?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。