c# – F#中的依赖属性默认值不匹配
发布时间:2020-12-15 08:05:41 所属栏目:百科 来源:网络整理
导读:我试图转换一个C#依赖属性,它将输入ComboBox的文本的最大长度限制为F#.该程序是一个MVVM程序,它使用F#作为模型和视图模型,使用C#作为视图.工作的C#代码是这样的: public class myComboBoxProperties { public static int GetMaxLength(DependencyObject obj
我试图转换一个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错误是:
我究竟做错了什么? 解决方法
你可以试试这个
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.我怀疑你只想第一次订阅? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |