Dotvvm运行时绑定到'对象'类型

时间:2018-06-19 03:48:05

标签: c# asp.net mvvm binding dotvvm

我有这个课程

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

我想创建上述类List<Property>的列表,并仅动态添加Mark Up Controls Code ,所以他们的网站上有一个示例HERE,我对该示例所做的是向Property类添加TextBoxWithLabel类型的公共属性,并更改了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, "");

当我运行应用并在输入字段中输入内容时,类型Value的{​​{1}}属性仍为Property,这就是我被卡住的地方 我也尝试调试null,但事实证明它没有到达那里,因此运行时绑定存在问题,这是他们的例子&#39;这行代码

setter

任何帮助将表示赞赏:)

修改

为了进一步澄清,我有一个名为textBox.SetBinding(TextBox.TextProperty, GetValueBinding(TextProperty)); 的页面 和后面带有代码的标记控件MainAppPage 简单地说,ContentControlMainAppPage中使用此List<Property>传递给ContentControl MainAppPage然后<controls:ContentControl Instance="{value: ClassObject}"/>开始迭代ContentControl并创建源自List<Property>的{​​{1}}

InputFieldHtmlGenericControl中呈现为魅力 唯一不起作用的是绑定,所以再次,如何将InputField绑定到ContentControl,以便用户在用户界面中发生的任何更改都会在Property.Value变得没有焦点之后反映在InputField.Text上任何其他MVVM模式?

1 个答案:

答案 0 :(得分:1)

DotVVM没有分配给使用setter的属性,而是在DotvvmBindableObject中设置底层属性存储。这与WPF对DependencyProperty的作用非常相似,需要表示数据绑定。实际上你可以完全省略C#属性声明,声明字段TextProperty并调用DotvvmProperty.Register足以声明dotvvm的属性。

其他“问题”是控件不存储任何数据,所有内容都必须保存在视图模型中。您只能使用控件属性对视图模型属性进行数据绑定。我想我们在这里运行XY problem,我只能说出为什么你的代码不起作用,但我不知道实际上要做什么......

无论如何,如果您只想将控件“绑定”到视图模型属性,请查看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}" />