usergaro
usergaro

Reputation: 427

How to implement dependency object/property on custom class?

Here is my Person Class:

    public class Person
{
    private string _lastName;

    public string LastName
    {
        get { return _lastName; }
        set { _lastName = value; }

    }
}//close class

Here is my XAML:

        <StackPanel>
        <TextBox x:Name="txtLastName" 
                 Height="50" Width="300"
                 DataContext="{Binding ElementName=_this, Path=PersonObject}" 
                 Text="{Binding Path=LastName}" />

        <Button Height="50" Width="100" x:Name="btnChangeValue" Content="Change Value" Click="btnChangeValue_Click"/>
    </StackPanel>

Here is my XAML.CS

public partial class ClassDependency : Window
{
    public Person objPerson = new Person();
    public ClassDependency()
    {
        objPerson.LastName = "testing...";
        InitializeComponent();

    }

    public Person PersonObject
    {
        get { return objPerson; }
        set { objPerson = value; }
    }

    private void btnChangeValue_Click(object sender, RoutedEventArgs e)
    {
        objPerson.LastName = "New value after click....";
    }
}//close class

My question is: After clicking "btnChangeValue" it does changing Last Name in my code behind but it is not reflection my textbox "txtLastName". How can I fix this??? Should I implement Dependency Property in my xaml.cs file?? I tried that too but no use.

    public static readonly DependencyProperty PersonObjectProperty = DependencyProperty.Register("PersonObject", typeof(object), typeof(ClassDependency));
    public Person PersonObject
    {
        get { return (Person)GetValue(PersonObjectProperty); }
        set { SetValue(PersonObjectProperty, value); }
    }

What should I do?? Please advice..

Upvotes: 1

Views: 1868

Answers (2)

alf
alf

Reputation: 18550

Try this:

public class Person : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string _lastName;

    public string LastName
    {
        get { return _lastName; }
        set 
        { 
            _lastName = value; 
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("LastName"));
            }
        }
    }
}

This way, the framework gets notified when the property changes. See INotifyPropertyChanged Interface.

Upvotes: 2

Xtian Macedo
Xtian Macedo

Reputation: 835

The problem with your code is that you are not raising the PropertyChanged event, so the UI is not aware of the value change, on the setter of your dependency properties raise the PropertyChanged event as shown below:

public class Person : INotifyPropertyChanged 
{ 
    private string _lastName; 

    public string LastName 
    { 
        get { return _lastName; } 
        set  
        {  
            _lastName = value;  
            if (PropertyChanged != null) 
            { 
                PropertyChanged(this, new PropertyChangedEventArgs("LastName")); 
            } 
        } 
    } 
} 

Upvotes: 1

Related Questions