Justin Ross
Justin Ross

Reputation: 392

TextBox will not display the contents of a bound static generic list item

In WPF, I have a static "Customer" object in the definition for MainWindow.xaml.cs. This customer has a publicly accessible string Name property. In expression blend 4, I click on the "Advanced Options" box beside the "Text" property for the TextBox that I would like to bind to the customer name. I then click "Data Binding..." -> "Element Property" -> "window" under "scene elements" -> click the expander arrow beside "ActiveCustomer" -> then click "Name" -> "OK". The binding is to a readonly TextBox, so One Way binding is acceptable as the default. But when I run my app, it doesn't display the customer's name. Any Suggestions?

<TextBox x:Name="AIAHNameTextBox" Height="26" Canvas.Left="90" TextWrapping="Wrap" Canvas.Top="8" Width="100" IsReadOnly="True" VerticalContentAlignment="Center" Text="{Binding ActiveCustomer.Name, ElementName=window, Mode=OneWay}" />

ActiveCustomer is an instance of my Customer class:

namespace WPFBankingSystem
{
    public enum CustomerStatus
    { Open, Closed }
    public enum TransferType
    { CheckingToSaving, SavingToChecking }

    [Serializable]
    public class Customer
    {
        private string address;
        private Checking chkAcc;
        private string name;
        private int pin;
        private Saving savAcc;
        private string ssn;
        private AccountStatus status;
        private string tel;

        public string Address
        {
            get { return address; }
            set { address = value; }
        }
        public Checking ChkAcc
        {
            get { return chkAcc; }
            set { chkAcc = value; }
        }
        public string Name
        { get { return name; } }
        public int Pin
        {
            get { return pin; }
            set { pin = value; }
        }
        public Saving SavAcc
        {
            get { return savAcc; }
            set { savAcc = value; }
        }
        public string Ssn
        { get { return ssn; } }
        public AccountStatus Status
        {
            get { return status; }
            set { status = value; }
        }
        public string Tel
        {
            get { return tel; }
            set { tel = value; }
        }

        public void create(string Name, string Address, string TelephoneNumber, string SSN, int PIN)
        {
            this.address = Address;
            this.name = Name;
            this.pin = PIN;
            this.ssn = SSN;
            this.status = AccountStatus.Open;
            this.tel = TelephoneNumber;
        }
        public void delete()
        {
            if (this.chkAcc != null)
            { chkAcc.close(); }
            if (this.savAcc != null)
            { savAcc.close(); }
        }
        public bool hasChkAcc()
        { return (this.chkAcc != null) ? true : false; }
        public bool hasSavAcc()
        { return (this.savAcc != null) ? true : false; }
        public void show()
        { }
        public void transfer(double Amount, TransferType Type)
        {
            if(this.hasChkAcc() && this.hasSavAcc())
            {
                switch(Type)
                {
                    case TransferType.CheckingToSaving:
                        this.chkAcc.Balance -= Amount;
                        this.savAcc.Balance += Amount;
                        break;
                    case TransferType.SavingToChecking:
                        this.savAcc.Balance -= Amount;
                        this.chkAcc.Balance += Amount;
                        break;
                }
            }
            else
            { throw new Exception("You do not have both a checking account and a saving account."); }
        }

        public Customer()
        { }
        ~Customer()
        { this.delete(); }
    }
}

Inside MainWindow.xaml.cs, the customer is defined just as a public Customer object:

public Customer ActiveCustomer
{ get; set; }

Upvotes: 0

Views: 299

Answers (1)

brunnerh
brunnerh

Reputation: 185057

You cannot bind to static properties like you can to instance properties. The property ActiveCustomer then does not exist on the element named window it exists in the class MainWindow. You should be able to fix the binding by using a Source in conjunction with x:Static:

{Binding Name, Source={x:Static local:MainWindow.ActiveCustomer}}

Note that x:Static has a very specific syntax, it does not allow an arbitrary path or the like.

Even if the binding works this is problematic though as you cannot implement INPC for static properties, so if you assign a new object to ActiveCustomer there will be no update.

Upvotes: 2

Related Questions