我正在尝试转换一个C#Dependency Property,它将输入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错误是:
默认值类型与属性类型
不匹配MaxLength
我做错了什么?
答案 0 :(得分: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)
将OnMaxLengthChanged
转换为PropertyChangedCallback
。
但是,即使每次更改最大值,您也会订阅.Loaded
。我怀疑你只想第一次订阅?