views:

31

answers:

2

Is it possible to databind 2 properties to 1 control? Specifically, I'm thinking phone numbers. I've got an object where all of the properties are bindable directly to 1 control, but there is an areacode and phonenumber property on the object. My users very much prefer a masked textbox for entering phone numbers as opposed to 2 separate ones.

Likewise, it's much easier to add the binding in the form load and call the persistent objects .save() method instead of populating the controls on load and re-setting them on save (that, and there's a logical disconnect between databound properties in the form code and non-bound ones).

So, I'm wondering if it's possible at all.

Edit> solved thanks to Yoooder.

The code that I wrote to solve this looks like this:

public class Person : PersistentBase
{
    private string areaCode;
    private string number;

    public string AreaCode
    {
        get { return this.areaCode; }
        set { Persist("AreaCode", this.AreaCode, value); } // pseudocode
    }

    public string Number
    {
        get { return this.number; }
        set { Persist("Number", this.number, value); }
    }

    [NonPersistent]
    public string PhoneNumber
    {
        get { return string.Format("{0}{1}", this.AreaCode, this.Number)); }
        set
        {
            PhoneParts parts = SplitIntoParts(value); // uses regex etc.
            // Validate full phone number
            this.AreaCode = parts.AreaCode;
            this.Number = parts.Number;
        }
    }
}

and I bind as I normally would

textBox1.DataBindings.Add(new Binding("Text", this.person, "PhoneNumber"));
A: 

As far as my experiences have been, data binding is at the property level, so a control could contain multiple bindings.

For this specific question I would suggest that two fields to store a phone number might not be the best design.

overslacked
+2  A: 

Data binding lets you bind 1 property from your datasource to one property on your target control; each control can have multiple bindings. So your DataSource.Value can bind to TargetControl.Text; however you cannot bind both DataSource.Value1 and DataSource.Value2 to TargetControl.Text

If I understand your use case correctly then you'd likely want your datasource to be responsible for merging the area code and phone number into a single, bindable property. This means your datasource would merge the two properties together for binding and also split them apart for saving.

STW
That's a consideration that I didn't think of: in the setter for WholePhoneNumber (or something like that) I can set AreaCode and PhoneNumber... I like it. I'm going to give it a try, and if it works, I'm going to mark this as the answer. Thank you
SnOrfus
Just to let you know that this indeed worked perfectly.
SnOrfus