title: How do I correctly implement INotifyPropertyChanged for my bool property and bind to CheckBox.IsChecked?
body: <p>Novice here. I've been trying to wrap my head around databinding, and wanted to do try out two-way binding of a checkbox in the view to a boolean in a separate class that I've called "State". The point is to ensure that they are always in sync.</p>
  
  <p>So I've made a checkbox in the view and bound it to the aforementioned boolean property in the State-class, accompanied by a button that bypasses the checkbox and toggles the boolean property directly (aptly labeled 'Ninja!'). The point was to test that the checkbox' databinding reacts when the property changes. However, I can't for the best of me figure out how the OnPropertyChanged-method is supposed to be invoked when the property changes.</p>
  
  <p>Here's what I have so far:</p>
  
  <pre><code>&lt;CheckBox x:Name="checkBox" Content="CheckBox" HorizontalAlignment="Left" Margin="232,109,0,0" VerticalAlignment="Top" IsChecked="{Binding Checked, Mode=TwoWay}"/&gt;
  &lt;Button x:Name="button" Content="Ninja!" HorizontalAlignment="Left" Margin="228,182,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/&gt;
  </code></pre>
  
  <p>And the code for the "State"-class I've made:</p>
  
  <pre><code>namespace TestTwoWayBinding
  {
      class State : INotifyPropertyChanged
      {
          public event PropertyChangedEventHandler PropertyChanged;
          private bool _checked;
          public bool Checked {
              get
              {
                  return _checked;
              }
              set
              {
                  _checked = value;
                  OnPropertyChanged(Checked);
              }
          }       
  
          public void Toggle()
          {
              if (!Checked)
              {
                  Checked = true;
              }
              else
              {  
                  Checked = false;
  
              }
          }
  
          public State(bool c)
          {
              this.Checked = c;
          }
  
          protected virtual void OnPropertyChanged(string propertyName)
          {
              if(PropertyChanged != null)
              {
                  PropertyChanged(this, new PropertyChangedEventArgs(Checked));
              }
          }
      }
  }
  </code></pre>
  
  <p>And the code-behind on the view for initialization and handling the events:</p>
  
  <pre><code>namespace TestTwoWayBinding
  {
      /// &lt;summary&gt;
      /// Interaction logic for MainWindow.xaml
      /// &lt;/summary&gt;
      public partial class MainWindow : Window
      {
          private State _state;
          public MainWindow()
          {            
              InitializeComponent();
              _state = new State((bool)checkBox.IsChecked);
          }
  
          private void button_Click(object sender, RoutedEventArgs e)
          {
              _state.Toggle();
          }
      }
  }
  </code></pre>
  
  <p>From what I gather, OnPropertyChanged expects a String propertyName, but I don't know what that would entail here. When I put in the name of the property (Checked), then that naturally refers to a boolean, not a string. What am I not getting? And what else am I doing wrong, as the checkbox doesn't register the property change when I change it through the button?</p>