Steven Evers
Steven Evers

Reputation: 17226

DataBinding to a readonly property

Is it possible to bind a field (textbox) to a Property that doesn't implement a set?

For instance I have an object that implements INotifyPropertyChanged with 3 fields:

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; }
}

I can't quite test this yet as the UI isn't made and there is much other work to be done in this class before it will function, but is this possible the way I have it, or is there a different way?

Upvotes: 4

Views: 6718

Answers (3)

Thomas Levesque
Thomas Levesque

Reputation: 292765

I just tried, it works fine. The binding engine doesn't try to update the read-only properties. It doesn't prevent editing the controls (unless you make them read-only) but the edited value is not persisted

Upvotes: 3

Pavel Minaev
Pavel Minaev

Reputation: 101665

You can use such properties as source of data binding. Naturally, any such databinding would have to be OneWay and not TwoWay, so that changes to TextBox.Text will not be attempted to propagate back to the property (and fail because of it being readonly).

[EDIT] The above still holds for WinForms, but you don't need to care about OneWay/TwoWay. It will just never try to update the source if it's read-only.

Upvotes: 5

Andrew Hare
Andrew Hare

Reputation: 351758

No, since databinding relies heavily on setting values on properties retrieved via reflection you will have a lot of trouble databinding and expecting the value to be set on a readonly property.

In this example you would be unable to databind to the Tax and Total properties.

Upvotes: 1

Related Questions