我有这个课程
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
简单地说,ContentControl
在MainAppPage
中使用此List<Property>
传递给ContentControl
MainAppPage
然后<controls:ContentControl Instance="{value: ClassObject}"/>
开始迭代ContentControl
并创建源自List<Property>
的{{1}}
InputField
在HtmlGenericControl
中呈现为魅力
唯一不起作用的是绑定,所以再次,如何将InputField
绑定到ContentControl
,以便用户在用户界面中发生的任何更改都会在Property.Value
变得没有焦点之后反映在InputField.Text
上任何其他MVVM模式?
答案 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}" />