Dotvvm 运行-时间绑定到'object'类型

Dotvvm run-time binding to 'object' type

我有这个class

public class Property{
     public string Name {get;set;}
     public object Value {get;set;} 
}

我想创建上面的列表 class List<Property> 并仅动态添加标记控制代码 ,因此他们的网站上有一个示例 HERE,我对该示例所做的是将 Property 类型的 public 属性 添加到 TextBoxWithLabel class 并将上述绑定示例的 setter 更改为如下:

    [MarkupOptions(AllowHardCodedValue = false)]
    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set {
            SetValue(TextProperty, value);
            Property.Value = value;
        }
    }
    public static readonly DotvvmProperty TextProperty
        = DotvvmProperty.Register<string, TextBoxWithLabel>(c => c.Text, "");

当我 运行 应用程序并在输入字段中键入内容时,类型 PropertyValue 属性 仍然是 null,这里是我卡住了 我也试过调试 setter 结果发现它没有到达那里所以 运行 时间绑定有问题,这是 'as their example' 这行代码

textBox.SetBinding(TextBox.TextProperty, GetValueBinding(TextProperty));

任何帮助将不胜感激:)

编辑:

为了进一步说明,我有一个名为 MainAppPage 的页面 和带有隐藏代码的标记控件称为 ContentControl 简单地说,MainAppPageList<Property> 传递给 ContentControl,在 MainAppPage 中使用它 <controls:ContentControl Instance="{value: ClassObject}"/> 然后 ContentControl 开始遍历 List<Property> 并创建从 HtmlGenericControl

派生的 InputField

InputFieldContentControl 中的渲染就像一个魅力 唯一不起作用的是绑定,所以再一次,如何将 Property.Value 绑定到 InputField.Text,以便用户在 Property.Value 之后的 UI 中发生的任何更改反映在 InputField 之后] 像任何其他 MVVM 模式一样没有重点?

DotVVM 不会使用 setter 分配给 属性,而是在 DotvvmBindableObject 中设置基础 属性 存储。这与 WPF 对其 DependencyProperty 所做的非常相似,需要它来表示数据绑定。您实际上可以完全省略 C# 属性 声明,声明字段 TextProperty 并调用 DotvvmProperty.Register 足以为 dotvvm 声明一个 属性。

其他"problem"就是控件不存储任何数据,一切都必须持久化在视图模型中。您只能使用控件属性对视图模型进行数据绑定 属性。我认为我们 运行 变成了 XY problem,我只能说出为什么你的代码不起作用,但我不知道实际上正在尝试做什么...

无论如何,如果您只是想 "bind" 将您的控件控制到视图模型 属性,请查看 https://www.dotvvm.com/docs/tutorials/control-development-markup-controls-with-code/2.0。您可以这样声明 属性:

[MarkupOptions(AllowHardCodedValue = false)]
public string Text
{
    get { return (string)GetValue(TextProperty); }
    set { SetValue(TextProperty, value); }
}
public static readonly DotvvmProperty TextProperty
    = DotvvmProperty.Register<string, TextBoxWithLabel>(c => c.Text, "");

在您控制的标记中使用它

@baseType FullName.Of.YourControl
{{value: _control.Text}}

并使用您页面中的控件(或其他控件)

<cc:YourControl Text="{value: _this.Property.Value}" />