【问题标题】:Dotvvm run-time binding to 'object' typeDotvvm 运行时绑定到“对象”类型
【发布时间】:2018-11-27 22:36:48
【问题描述】:

我有这门课

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

我想创建上述类List<Property> 的列表并仅动态添加标记控件代码 ,所以作为他们的网站,他们有一个示例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, "");

当我运行应用程序并在输入字段中输入内容时,Property 类型的 Value 属性仍然是 null,这就是我卡住的地方 我也尝试调试setter,结果它没有到达那里,所以运行时绑定存在问题,这是'作为他们的例子'这行代码

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

任何帮助将不胜感激:)

编辑:

为了更清楚,我有一个名为MainAppPage的页面 和标记控件,后面的代码称为ContentControl 简单地说,MainAppPageList&lt;Property&gt; 传递给ContentControlMainAppPage 中使用它 &lt;controls:ContentControl Instance="{value: ClassObject}"/&gt; 然后ContentControl 开始遍历List&lt;Property&gt; 并创建派生自InputFieldHtmlGenericControl

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

【问题讨论】:

    标签: c# asp.net mvvm binding dotvvm


    【解决方案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}" />
    

    【讨论】:

    • 为了更清楚,我想在运行时将我的 Property.Value 绑定到 TextProperty 我不能简单地使用 ""因为它必须在运行时,所以我的问题很快:如何将 Property.Value 绑定到任何 DotvvmProperty '值'?
    • 你为什么在代码隐藏类中迭代而不使用类似&lt;dot:Repeater DataSource="{value: _control.Instance}"&gt;&lt;cc:InputField Text="{value: Text}" /&gt;&lt;/dot:Repeater&gt;
    • 我做到了,无论如何我注意到当我通过数据传递 viewModel 时,数据显示在 UI 中,但是当我在运行时修改数据并调试 viewModel 数据并没有改变我可以说的是绑定只是一个方向!从 MainAppPage 到 UI 可以,但从 UI 到 MainAppPage 不行!你能帮忙吗 ? :)
    • 我只能告诉你,如果你在绑定中有属性访问权限,这应该可以工作。
    • 简单地说,如何在绑定到视图模型或任何类属性的页面中使用仅控制代码?
    猜你喜欢
    • 2011-11-20
    • 2019-02-15
    • 2015-07-17
    • 2014-10-26
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多