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, "");
当我 运行 应用程序并在输入字段中键入内容时,类型 Property
的 Value
属性 仍然是 null
,这里是我卡住了
我也试过调试 setter
结果发现它没有到达那里所以 运行 时间绑定有问题,这是 'as their example' 这行代码
textBox.SetBinding(TextBox.TextProperty, GetValueBinding(TextProperty));
任何帮助将不胜感激:)
编辑:
为了进一步说明,我有一个名为 MainAppPage
的页面
和带有隐藏代码的标记控件称为 ContentControl
简单地说,MainAppPage
将 List<Property>
传递给 ContentControl
,在 MainAppPage
中使用它
<controls:ContentControl Instance="{value: ClassObject}"/>
然后 ContentControl
开始遍历 List<Property>
并创建从 HtmlGenericControl
派生的 InputField
InputField
在 ContentControl
中的渲染就像一个魅力
唯一不起作用的是绑定,所以再一次,如何将 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}" />
我有这个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, "");
当我 运行 应用程序并在输入字段中键入内容时,类型 Property
的 Value
属性 仍然是 null
,这里是我卡住了
我也试过调试 setter
结果发现它没有到达那里所以 运行 时间绑定有问题,这是 'as their example' 这行代码
textBox.SetBinding(TextBox.TextProperty, GetValueBinding(TextProperty));
任何帮助将不胜感激:)
编辑:
为了进一步说明,我有一个名为 MainAppPage
的页面
和带有隐藏代码的标记控件称为 ContentControl
简单地说,MainAppPage
将 List<Property>
传递给 ContentControl
,在 MainAppPage
中使用它
<controls:ContentControl Instance="{value: ClassObject}"/>
然后 ContentControl
开始遍历 List<Property>
并创建从 HtmlGenericControl
InputField
InputField
在 ContentControl
中的渲染就像一个魅力
唯一不起作用的是绑定,所以再一次,如何将 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}" />