PiZzL3
PiZzL3

Reputation: 2210

WPF, why does my Binding only update from MainWindow?

Why does view.aBOX only update TextBoxA from within MainWindow? and how to I fix that?

When I pass view to w, it runs perfectly fine. Even the debugger shows view.aBOX being updated with the message in w. However, it never updates TextBoxA from within w.

Example code:

//MAIN
public partial class MainWindow : Window
{
    ViewModel view; //DEBUGGER SHOWS aBOX = "Worker STARTED", But no update
    Worker w; 

    public MainWindow()
    {
        this.view = new ViewModel();
        this.DataContext = this.view;

        //TEST
        this.view.aBOX = "BINDING WORKS!!"; //UPDATES FINE HERE

        this.w = new Worker(this.view); 
    }
}

//VIEW
public class ViewModel
{
    public string aBOX { get; set; }
}

//WORKER
public class Worker
{
    ViewModel view;
    public Worker(ViewModel vm)
    {
        this.view = vm; 
        this.view.aBOX = "Worker STARTED"; //NEVER SEE THIS IN TextBoxA
    }
}

//XAML/WPF
<TextBox Name="TextBoxA" Text="{Binding Path=aBOX, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />

Upvotes: 3

Views: 321

Answers (1)

Femaref
Femaref

Reputation: 61437

You need to implement INotifyPropertyChanged for changes to be propagated to the binding engine.

If you are able to use a base class, you could use this:

public class Notify : INotifyPropertyChanged
{
    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(Expression<Func<object>> exp)
    {
        string propertyName = ((exp.Body as UnaryExpression).Operand as MemberExpression).Member.Name;

        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion
}

Using it:

public int Property
{
  //getter
  set
  {
    property = value;
    RaisePropertyChanged(() => Property);
  }  
}

With this code, you can easily refactor the property and don't have to deal with magic strings. Also, you get intellisense.

Upvotes: 4

Related Questions