title: UserControl DependencyProperty binding in ListView
body: <p>When I try to use a custom UserControl in a ListView, it fails and only empty blocks are displayed (the following TextBlock works though). While the customControl outside the ListView works pretty well. What's the problem?</p>
  
  <hr>
  
  <p>MainWindow.xaml</p>
  
  <pre><code>&lt;Grid&gt;
      &lt;StackPanel&gt;
          &lt;controls:CustomControl x:Name="customControl" CustomText="Test"/&gt;
          &lt;ListView x:Name="listView"&gt;
              &lt;ListView.ItemTemplate&gt;
                  &lt;DataTemplate&gt;
                      &lt;StackPanel&gt;
                          &lt;controls:CustomControl CustomObject="{Binding}"/&gt;
                          &lt;TextBlock Text="{Binding Text}"/&gt;
                      &lt;/StackPanel&gt;
                  &lt;/DataTemplate&gt;
              &lt;/ListView.ItemTemplate&gt;
          &lt;/ListView&gt;
      &lt;/StackPanel&gt;
  &lt;/Grid&gt;
  </code></pre>
  
  <p>MainWindow.cs</p>
  
  <pre><code>public partial class MainWindow : Window
  {
      public MainWindow()
      {
          InitializeComponent();
          InitializeMyComponent();
      }
  
      public System.Collections.ObjectModel.ObservableCollection&lt;CustomClass&gt; CustomCollection { get; set; }
  
      private void InitializeMyComponent()
      {
          this.CustomCollection = new System.Collections.ObjectModel.ObservableCollection&lt;CustomClass&gt;();
          this.CustomCollection.Add(new CustomClass() { Number = 1, Text = "a" });
          this.CustomCollection.Add(new CustomClass() { Number = 2, Text = "b" });
          this.CustomCollection.Add(new CustomClass() { Number = 3, Text = "c" });
          this.listView.ItemsSource = this.CustomCollection;
          this.customControl.Custom = new CustomClass() { Number = 0, Text = "customControl" };
      }
  }
  </code></pre>
  
  <p>CustomControl.xaml</p>
  
  <pre><code>&lt;Grid&gt;
      &lt;StackPanel&gt;
          &lt;TextBlock&gt;
              &lt;Run x:Name="numberRun" Text="{Binding CustomObject.Number}"/&gt;
              &lt;Run x:Name="textRun" Text="{Binding CustomObject.Text}"/&gt;
              &lt;Run Text="{Binding CustomText}"/&gt;
          &lt;/TextBlock&gt;
      &lt;/StackPanel&gt;
  &lt;/Grid&gt;
  </code></pre>
  
  <p>CustomControl.cs</p>
  
  <pre><code>public partial class CustomControl : UserControl
  {
      public static readonly DependencyProperty CustomObjectProperty;
      public static readonly DependencyProperty CustomTextProperty;
  
      static CustomControl()
      {
          CustomObjectProperty = DependencyProperty.Register("CustomObject", typeof(CustomClass), typeof(CustomControl), new PropertyMetadata(default(CustomClass), OnCustomObjectPropertyChanged));
          CustomTextProperty = DependencyProperty.Register("CustomText", typeof(string), typeof(CustomControl), new PropertyMetadata(string.Empty, OnCustomTextPropertyChanged));
      }
      public CustomControl()
      {
          InitializeComponent();
          this.DataContext = this;
      }
  
      public CustomClass CustomObject
      {
          get
          {
              return (CustomClass)(this.GetValue(CustomObjectProperty));
          }
          set
          {
              this.SetValue(CustomObjectProperty, value);
          }
      }
      public string CustomText
      {
          get
          {
              return (string)(this.GetValue(CustomTextProperty));
          }
          set
          {
              this.SetValue(CustomTextProperty, value);
          }
      }
  
      private static void OnCustomObjectPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { }
      private static void OnCustomTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { }
  }
  </code></pre>
  
  <p>CustomClass.cs</p>
  
  <pre><code>public class CustomClass : INotifyPropertyChanged
  {
      private int number;
      private string text;
  
      public CustomClass()
      {
          this.number = new int();
          this.text = string.Empty;
      }
  
      public int Number
      {
          get
          {
              return this.number;
          }
          set
          {
              this.number = value;
              this.OnPropertyChanged();
          }
      }
      public string Text
      {
          get
          {
              return this.text;
          }
          set
          {
              this.text = value;
              this.OnPropertyChanged();
          }
      }
  
      public event PropertyChangedEventHandler PropertyChanged;
  
      protected void OnPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string name = null)
      {
          PropertyChangedEventHandler handler = this.PropertyChanged;
          if (handler != null)
          {
              handler(this, new PropertyChangedEventArgs(name));
          }
      }
  }
  </code></pre>