我正在尝试将限制输入 ComboBox 的文本的最大长度的 C# 依赖属性转换为 F#。该程序是一个 MVVM 程序,使用 F# 作为模型和 View 模型,使用 C# 作为 View 。工作的 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<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
很奇怪,即使您每次更改最大值也是如此。我怀疑你只喜欢第一次订阅?
关于c# - F# 默认值中的依赖属性不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30278273/