title: What's the official word on binding to non-Properties (i.e. fields)?
body: <p>From the book WPF 4 Unleashed:</p>
  
  <blockquote>
    <p>Although the source property can be any .NET property on any .NET
    object, the same is not true for the data-binding target. The target
    property must be a dependency property. Also note that the source
    member must be a real (and public) property, not just a simple field.</p>
  </blockquote>
  
  <p>However, here's a counter example to the claim that the source must be a property. This program binds a <code>Label</code> and a <code>ListBox</code> to a normal field of type <code>ObservableCollection&lt;int&gt;</code>.</p>
  
  <p>Xaml:</p>
  
  <pre><code>&lt;Window x:Class="BindingObservableCollectionCountLabel.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          Title="MainWindow" Height="350" Width="525"&gt;
  
      &lt;DockPanel&gt;
  
          &lt;StackPanel&gt;
              &lt;TextBox Name="textBox" Text="10"/&gt;
              &lt;Button Name="add" Click="add_Click" Content="Add"/&gt;
              &lt;Button Name="del" Click="del_Click" Content="Del"/&gt;
              &lt;Label Name="label" Content="{Binding Source={StaticResource ints}, Path=Count}"/&gt;
              &lt;ListBox ItemsSource="{Binding Source={StaticResource ints}}"/&gt;
          &lt;/StackPanel&gt;
  
      &lt;/DockPanel&gt;
  &lt;/Window&gt;
  </code></pre>
  
  <p>C#:</p>
  
  <pre><code>using System;
  using System.Windows;
  using System.Collections.ObjectModel;
  
  namespace BindingObservableCollectionCountLabel
  {
      public partial class MainWindow : Window
      {
          public ObservableCollection&lt;int&gt; ints;
  
          public MainWindow()
          {
              Resources.Add("ints", ints = new ObservableCollection&lt;int&gt;());
  
              InitializeComponent();
          }
  
          private void add_Click(object sender, RoutedEventArgs e)
          {
              ints.Add(Convert.ToInt32(textBox.Text));
          }
  
          private void del_Click(object sender, RoutedEventArgs e)
          {
              if (ints.Count &gt; 0) ints.RemoveAt(0);
          }
      }    
  }
  </code></pre>
  
  <p>So what's the official word on what qualifies as a data binding source? Should we only bind to properties? Or are fields technically allowed as well?</p>