【问题标题】:DataBinding to a readonly property数据绑定到只读属性
【发布时间】:2010-11-19 18:48:40
【问题描述】:

是否可以将字段(文本框)绑定到不实现集合的属性?

例如,我有一个使用 3 个字段实现 INotifyPropertyChanged 的​​对象:

public decimal SubTotal
{
    get { return this.subTotal; }
    set 
    {
        this.subTotal = value;
        this.NotifyPropertyChanged("SubTotal");
        this.NotifyPropertyChanged("Tax");
        this.NotifyPropertyChanged("Total");
    }
}

public decimal Tax 
{
    get { return this.taxCalculator.Calculate(this.SubTotal, this.Region); }
}

public decimal Total
{
    get { return this.SubTotal + this.Tax; }
}

我还不能完全测试这个,因为 UI 还没有制作出来,在这个类中还有很多其他工作要完成才能运行,但这可能是我的方式吗,还是有不同的方式?

【问题讨论】:

    标签: c# winforms data-binding properties inotifypropertychanged


    【解决方案1】:

    您可以使用这些属性作为数据绑定的来源。自然,任何此类数据绑定都必须是 OneWay 而不是 TwoWay,因此不会尝试将对 TextBox.Text 的更改传播回属性(并且由于它是只读的而失败)。

    [编辑]以上内容仍然适用于 WinForms,但您无需关心 OneWay/TwoWay。如果它是只读的,它将永远不会尝试更新源。

    【讨论】:

    • 我的回答是专门在 WPF 上下文中。是的,我已经尝试过了——我在一个大量使用 WPF 和数据绑定的代码库上工作,并且我自己编写了很多代码绑定到只读属性。
    • 我只是编辑了帖子以表明我正在使用 winforms。但考虑到你的编辑,我很有希望。我还应该注意,有问题的文本框将不会启用,因此不允许输入。
    • 刚刚达到我能够运行和测试它的地步,它确实像你说的那样工作(我使用:textbox.DataBindings.Add(new Binding("Text", objectName, "Tax "));) 它工作得很好。谢谢
    【解决方案2】:

    我刚试过,效果很好。绑定引擎不会尝试更新只读属性。它不会阻止编辑控件(除非您将它们设为只读),但编辑后的值不会保留

    【讨论】:

      【解决方案3】:

      不,因为数据绑定在很大程度上依赖于设置通过反射检索到的属性的值,所以数据绑定和期望值被设置在只读属性上会遇到很多麻烦。

      在此示例中,您将无法将数据绑定到 TaxTotal 属性。

      【讨论】:

      • 呃,为什么?您绝对可以在数据绑定中使用只读属性作为 source,这听起来像是他在这里尝试做的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多