title: Three-column GridView: one with only text, the other two with checkboxes
body: <p>I'm having trouble binding values to checkboxes and, subsequently, checkboxes to the GridViewColumn. Basically, I have three columns named Property, Tele, and Surr respectively, and I have a list of objects of type Row. Row has three properties: Name (string), Tel (bool) and Sur (bool. I want to populate Property with all the Names (and that seems to be working fine, via a DisplayMemberBinding), and the other two columns with checkboxes whose states correspond to the values of Tel and Sur.</p>
  
  <p>Where am I going wrong?</p>
  
  <p><strong>XAML:</strong></p>
  
  <pre><code>&lt;UserControl x:Class="WpfApplication2.MainWindow"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
           xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
           mc:Ignorable="d" 
           DataContext="{Binding RelativeSource={RelativeSource Self}}"
           Margin="0,0,-8,0"&gt;
  
  &lt;Grid x:Name="GView" Margin="0,0,-8,0"&gt;
      &lt;TextBox HorizontalAlignment="Left" Height="23" Margin="114.99,12.96,0,0" TextWrapping="Wrap" Text="DefaultName" VerticalAlignment="Top" Width="175.01"/&gt;
      &lt;Label Content="Name:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/&gt;
  
      &lt;ListView DataContext="{Binding ElementName=rows}" 
                x:Name="LView" HorizontalAlignment="Left" Height="159" Margin="0,52,0,0" VerticalAlignment="Top" Width="292"&gt;
  
          &lt;ListView.View&gt;
              &lt;GridView&gt;
                  &lt;GridViewColumn x:Name="Property" 
                                  Width="100" 
                                  Header="Property"
                                  DisplayMemberBinding="{Binding Name}"&gt;
                  &lt;/GridViewColumn&gt;
                  &lt;GridViewColumn x:Name="Tele" 
                                  Width="100" 
                                  Header="In Tele?"
                                  DisplayMemberBinding="{Binding Tel}"&gt;
                      &lt;GridViewColumn.CellTemplate&gt;
                          &lt;DataTemplate&gt;
                              &lt;CheckBox x:Name="telCheck" 
                                        IsChecked="{Binding Source={RelativeSource Tel}}"&gt;&lt;/CheckBox&gt;
                          &lt;/DataTemplate&gt;
                      &lt;/GridViewColumn.CellTemplate&gt;
                  &lt;/GridViewColumn&gt;
                  &lt;GridViewColumn x:Name="Surr" 
                                  Width="100" 
                                  Header="In Surr?" 
                                  DisplayMemberBinding="{Binding Sur}"&gt;
                      &lt;GridViewColumn.CellTemplate&gt;
                          &lt;DataTemplate&gt;
                              &lt;CheckBox x:Name="telCheck" 
                                        IsChecked="{Binding Source={RelativeSource Sur}}"&gt;&lt;/CheckBox&gt;
                          &lt;/DataTemplate&gt;
                      &lt;/GridViewColumn.CellTemplate&gt;
                  &lt;/GridViewColumn&gt;
              &lt;/GridView&gt;
          &lt;/ListView.View&gt;
      &lt;/ListView&gt;
  &lt;/Grid&gt;
  </code></pre>
  
  <p></p>
  
  <p><strong>XAML.CS:</strong></p>
  
  <pre><code>public partial class MainWindow : UserControl
  {
      private ObservableCollection&lt;Row&gt; rows; 
  
      public ObservableCollection&lt;Row&gt; Rows
      {
          get { return rows; }
      }
  
      public MainWindow()
      {
          rows = new ObservableCollection&lt;Row&gt;();
          rows.Add(new Row("item1", true, false));
          rows.Add(new Row("item2", true, true));
          InitializeComponent();
      }
  }
  </code></pre>
  
  <p>}</p>
  
  <p><strong>Row.cs:</strong></p>
  
  <pre><code>public class Row : INotifyPropertyChanged
  {
      private string _name;
      private bool _tel;
      private bool _sur;
  
      public string Name
      {
          get { return _name; }
          set
          {
              if (_name == value)
                  return;
              _name = value;
              NotifyPropertyChanged("Name");
          }
      }
      public bool Tel
      {
          get { return _tel; }
          set
          {
              if (_tel == value)
                  return;
              _tel = value;
              NotifyPropertyChanged("Tel");
          }
      }
      public bool Sur
      {
          get { return _sur; }
          set
          {
              if (_sur == value)
                  return;
              _sur = value;
              NotifyPropertyChanged("Sur");
          }
      }
  
      public Row(string name, bool value, bool value2)
      {
          Name = name;
          Tel = value;
          Sur = value2;
      }
  
      public event PropertyChangedEventHandler PropertyChanged;
      private void NotifyPropertyChanged(String info)
      {
          if (PropertyChanged != null)
          {
              PropertyChanged(this, new PropertyChangedEventArgs(info));
          }
      }
  
  }
  </code></pre>
  
  <p>}</p>