Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does WPF INotifyPropertyChanged work?

Tags:

This is a typical INotifyPropertyChanged implementation for using Binding in WPF/C#.

namespace notifications.ViewModel {     class MainViewModel : INotifyPropertyChanged     {         public const string NamePropertyName = "CheckBoxState";         private bool _checkboxstate = true;          public bool CheckBoxState         {             get { return _checkboxstate; }             set             {                 if (_checkboxstate == value) return;                 _checkboxstate = value;                 RaisePropertyChanged(NamePropertyName);             }         }         public event PropertyChangedEventHandler PropertyChanged;         private void RaisePropertyChanged(string propertyName)         {             if (PropertyChanged != null)             {                 PropertyChanged(this, new PropertyChangedEventArgs(propertyName));             }         }     } } 

I also have a XAML code that has a binding to CheckBoxState. enter image description here

<Grid>     <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">         <CheckBox Content="Click Me" IsChecked="{Binding Path=CheckBoxState, Mode=TwoWay}" />         <TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" />     </StackPanel> </Grid> 

This is the MainWindow.xaml.cs to link between the DataContext and model.

public partial class MainWindow : Window {     notifications.ViewModel.MainViewModel model = new notifications.ViewModel.MainViewModel();      public MainWindow()     {         InitializeComponent();         this.DataContext = model;     } } 

When the user sets the check box, I think what would happen is as follows : IsChecked becomes true, and with "{Binding Path=CheckBoxState, Mode=TwoWay}", CheckBoxState property becomes true to call RaisePropertyChanged() and accordingly PropertyChanged(). As the parameter to this function is CheckBoxState, every Binding with Path CheckBoxState is notified to update itself.

  • How does this call activates <TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" />? What's the C#'s magic behind this to make it possible?
  • Why is if (PropertyChanged != null) necessary? Who sets up the PropertyChanged to what value?
  • The meaning of Mode=TwoWay looks like that it not only can signal the change, but also updates the content when other Binding element with the same name in binding changes, then what about OneWay mode? Can we set a Binding as source only or target only?
like image 725
prosseek Avatar asked Jul 22 '11 11:07

prosseek


People also ask

What is INotifyPropertyChanged in WPF?

The INotifyPropertyChanged interface is used to notify clients, typically binding clients, that a property value has changed. For example, consider a Person object with a property called FirstName .

How do you use INotifyPropertyChanged?

To implement INotifyPropertyChanged you need to declare the PropertyChanged event and create the OnPropertyChanged method. Then for each property you want change notifications for, you call OnPropertyChanged whenever the property is updated.

What does Raisepropertychanged do?

The RaisePropertyChanging event is used to notify UI or bound elements that the data has changed. For example a TextBox needs to receive a notification when the underlying data changes, so that it can update the text you see in the UI.

What is two way binding in WPF?

Two way binding is used when we want to update some controls property when some other related controls property change and when source property change the actual control also updates its property.


1 Answers

How does this call activates ? What's the C#'s magic behind this to make it possible?

This code creates a Binding object which links the TextBlock's Text property to the ViewModel property. It also adds an event handler to the ViewModel's PropertyChanged event to update the text value when the ViewModel fires the PropertyChanged event (with the right property).

Why is if (PropertyChanged != null) necessary? Who sets up the PropertyChanged to what value?

If the PropertyChanged event is null, then firing it will cause a NullReferenceException.

The meaning of Mode=TwoWay looks like that it not only can signal the change, but also updates the content when other Binding element with the same name in binding changes, then what about OneWay mode? Can we set a Binding as source only or target only?

The binding modes are:

  • TwoWay: Changes the bound value when the ViewModel property changes and vice versa
  • OneWay: Changes the bound value when the ViewModel property changes only
  • OneWayToSource: Changes the ViewModel property when the bound value changes only
  • OneTime: Sets the bound value to the value of the ViewModel property just when the application is created or the data context changes.

You can read more about them here: http://msdn.microsoft.com/en-us/library/system.windows.data.bindingmode.aspx

like image 175
Jackson Pope Avatar answered Dec 08 '22 00:12

Jackson Pope