How can I bind a custom object in code to a grid in XAML?

The following example binds the Message property correctly, but the FirstName, LastName, and Age properties of the Customer object are empty. Why is this?

XAML:

<Window x:Class="TestBinding9922.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>

        <TextBlock Text="{Binding Message}"/>

        <Grid DataContext="{Binding Customer}" >
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>

            <Label Grid.Column="0" Grid.Row="0" Content="First Name:" />
            <Label Grid.Column="0" Grid.Row="1" Content="Last Name:" />
            <Label Grid.Column="0" Grid.Row="2" Content="Age:" />

            <TextBox Grid.Column="1" Grid.Row="0" Text="{Binding FirstName}" />
            <TextBox Grid.Column="1" Grid.Row="1" Text="{Binding LastName}" />
            <TextBox Grid.Column="1" Grid.Row="2" Text="{Binding Age}" />

        </Grid>

    </StackPanel>
</Window>

      

Code-Behind:

using System.Windows;
using System.ComponentModel;

namespace TestBinding9922
{
    public partial class Window1 : Window, INotifyPropertyChanged
    {
        public string Message { get; set; }
        public Customer Customer { get; set; }

        public Window1()
        {
            InitializeComponent();
            DataContext = this;

            Message = "this works";

            Customer customer = new Customer() { FirstName = "Jim", LastName = "Smith", Age = 45 };
        }
    }

    public class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
    }
}

      

Adding:

Even when I use INotifyPropertyChanged, the text boxes are empty:

using System.Windows;
using System.ComponentModel;

namespace TestBinding9922
{
    public partial class Window1 : Window, INotifyPropertyChanged
    {
        #region ViewModelProperty: Message
        private string _message;
        public string Message
        {
            get
            {
                return _message;
            }

            set
            {
                _message = value;
                OnPropertyChanged("Message");
            }
        }
        #endregion

        #region ViewModelProperty: Customer
        private Customer _customer;
        public Customer Customer
        {
            get
            {
                return _customer;
            }

            set
            {
                _customer = value;
                OnPropertyChanged("Customer");
            }
        }
        #endregion

        public Window1()
        {
            InitializeComponent();
            DataContext = this;

            Message = "this works";

            Customer customer = new Customer() { FirstName = "Jim", LastName = "Smith", Age = 45 };
        }

        #region INotifiedProperty Block
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;

            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion

    }

    public class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
    }

}

      

+2


source to share


3 answers


Your Customer class needs to implement INotifyPropertyChanged, and the properties that are subsequently changed should tell you when they will change.

You can find an example here .



Also, you are not instantiating the Customer property, you are creating a local variable; it should be:

Customer = new Customer() 
    { FirstName = "Jim", LastName = "Smith", Age = 45 };

      

+3


source


It looks like you are assigning a new client instance to the local variable "client" instead of the "Window" property.



+2


source


You can remove the DataContext setting for the grid in XAML and then bind the text fields to Customer.FirstName etc.

Or you can remove the DataContext setting for the grid in XAML as before, but give the grid a name and then set your DataContext to code-behind, just like you did for the window.

0


source







All Articles