views:

82

answers:

1

I created a combobox and set observable collection as the itemsource and implemented INotifyPropertyChanged on the observable collection item. Even after that, when I select different item in the combobox, the OnPropertyChange method is not invoked. I think I am not making the binding properly. Could any one please correct me/ suggest me in this regard.

---------------------------------MainPage.xaml---------------------------------------------------

<UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  x:Class="MasterDetailsUpdate.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">

    <StackPanel Width="300">

            <ComboBox Name="cboName"></ComboBox>

            <TextBox Name="tbxName" Text="{Binding Path=name,Mode=TwoWay,ElementName=cboName}" ></TextBox>


    </StackPanel>

</UserControl>

---------------------------MainPage.xaml.cs-----------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;

namespace MasterDetailsUpdate
{

    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(MainPage_Loaded);
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            ObservableCollection<Person> persons = new ObservableCollection<Person>();
            persons.Add(new Person { city = "c1", name = "n1" });
            persons.Add(new Person { city = "c2", name = "n2" });
            persons.Add(new Person { city = "c3", name = "" });
            persons.Add(new Person { city = "c4", name = "" });
            persons.Add(new Person { city = "c5", name = "n1" });

            cboName.ItemsSource = persons;
            cboName.DisplayMemberPath = "name";
        }       
    }

    public class Person : INotifyPropertyChanged
    {
        private string _name;
        private string _city;
        public string name
        {
            set
            {
                _name = value;
                OnPropertyChanged("name");
            }
            get
            {
                return _name;
            }
        }


        public string city
        {
            set
            {
                _city = value;
                OnPropertyChanged("city");
            }
            get
            {
                return _city;
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion
    }
}

Thank You

+1  A: 

No you aren't binding right, your textbox binding should look like this:-

<TextBox Name="tbxName" Text="{Binding Path=SelectedItem.name, Mode=TwoWay, ElementName=cboName}" />

A ComboBox doesn't have a name property. It does have a SelectedItem property which will be the Person instance currently selected. You then want the name property of that instance. Hence the path you need in the binding is SelectedItem.name.

Now you should find that when you edit the textbox and move the focus elsewhere then PropertyChange event will fire and you should see the change in the combo box.

Note by default textbox does not update its value until the user presses tab or in some other way moves the focus on.

AnthonyWJones