c# - F# 默认值中的依赖属性不匹配

标签 c# f# dependency-properties

我正在尝试将限制输入 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/

相关文章:

f# - 在 F# 中通过公共(public) ID 将多个数据列表合并在一起

c# - 为什么人们不将依赖属性包装在通用类中?

c# - 调试停止 Windows 服务

c# - 递归读取 List<Object>

c# - Entity Framework 中的 CTE Sql 查询支持 <DefiningQuery>

c# - 传递数组作为参数

.net - f# 中的循环类型引用

list - F#:递归函数:将列表分为两个相等的部分

wpf - 触发器上的属性不能为空

c# - 为什么 AutoFac 的 AsImplementedInterfaces 在另一种类型上会破坏我的解析器?