title: Why does my Custom UserControl's dependency property not work with binding?
body: <p>My Custom UserControl's dependency property <strong>will</strong> bind correctly if the value is <strong>statically</strong> defined in the XAML calling it, like this:</p>
  
  <pre><code>ItemTypeIdCode="addresses"
  </code></pre>
  
  <p>but not if the value is bound <strong>dynamically</strong> itself:</p>
  
  <pre><code>ItemTypeIdCode="{Binding ItemTypeIdCode}"
  </code></pre>
  
  <p><strong>What do I have to do to my custom UserControl so that it's dependency property reacts to the value that is bound itself in another control?</strong></p>
  
  <p>Here is my code:</p>
  
  <p><strong>XAML:</strong></p>
  
  <pre><code>&lt;Window x:Class="TestDepenProp.Window1"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:controls="clr-namespace:TestDepenProp.Controls"
      Title="Window1" Height="300" Width="300"&gt;
      &lt;StackPanel 
          HorizontalAlignment="Left"
          Margin="10"&gt;
          &lt;controls:DropDown 
              ItemTypeIdCode="{Binding ItemTypeIdCode}"  
              SelectedValue="672"
              Width="150"
              Margin="0 0 0 5"/&gt;
          &lt;TextBlock Text="{Binding ItemTypeIdCode}"/&gt;
      &lt;/StackPanel&gt;
  &lt;/Window&gt;
  </code></pre>
  
  <p><strong>Code-Behind:</strong></p>
  
  <pre><code>using System.Windows;
  using System.ComponentModel;
  
  namespace TestDepenProp
  {
      public partial class Window1 : Window, INotifyPropertyChanged
      {
          #region ViewModelProperty: ItemTypeIdCode
          private string _itemTypeIdCode;
          public string ItemTypeIdCode
          {
              get
              {
                  return _itemTypeIdCode;
              }
  
              set
              {
                  _itemTypeIdCode = value;
                  OnPropertyChanged("ItemTypeIdCode");
              }
          }
          #endregion
  
          public Window1()
          {
              InitializeComponent();
              DataContext = this;
  
              ItemTypeIdCode = "addresses";
          }
          #region INotifiedProperty Block
          public event PropertyChangedEventHandler PropertyChanged;
  
          protected void OnPropertyChanged(string propertyName)
          {
              PropertyChangedEventHandler handler = PropertyChanged;
  
              if (handler != null)
              {
                  handler(this, new PropertyChangedEventArgs(propertyName));
              }
          }
          #endregion
      }
  }
  </code></pre>
  
  <p><strong>DropDown.xaml:</strong></p>
  
  <pre><code>&lt;UserControl x:Class="TestDepenProp.Controls.DropDown"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&gt;
      &lt;StackPanel&gt;
          &lt;ComboBox SelectedValuePath="Key"
                    DisplayMemberPath="Value"
                    SelectedValue="{Binding SelectedValue}"
                    Margin="0 0 0 10"
                    ItemsSource="{Binding DropDownValues}" /&gt;
      &lt;/StackPanel&gt;
  &lt;/UserControl&gt;
  </code></pre>
  
  <p><strong>DropDown.xaml.cs:</strong></p>
  
  <pre><code>using System.Windows;
  using System.Windows.Controls;
  using System.ComponentModel;
  using System.Collections.ObjectModel;
  using System.Collections.Generic;
  
  namespace TestDepenProp.Controls
  {
      public partial class DropDown : UserControl, INotifyPropertyChanged
      {
  
          public static readonly DependencyProperty ItemTypeIdCodeProperty = DependencyProperty.Register("ItemTypeIdCode", typeof(string), typeof(DropDown));
  
          public string ItemTypeIdCode
          {
              get { return (string)GetValue(ItemTypeIdCodeProperty); }
              set { SetValue(ItemTypeIdCodeProperty, value); }
          }
  
          #region ViewModelProperty: DropDownValues
          private ObservableCollection&lt;KeyValuePair&lt;string, string&gt;&gt; _dropDownValues = new ObservableCollection&lt;KeyValuePair&lt;string, string&gt;&gt;();
          public ObservableCollection&lt;KeyValuePair&lt;string, string&gt;&gt; DropDownValues
          {
              get
              {
                  return _dropDownValues;
              }
  
              set
              {
                  _dropDownValues = value;
                  OnPropertyChanged("DropDownValues");
              }
          }
          #endregion
  
          #region ViewModelProperty: SelectedValue
          private string _selectedValue;
          public string SelectedValue
          {
              get
              {
                  return _selectedValue;
              }
  
              set
              {
                  _selectedValue = value;
                  OnPropertyChanged("SelectedValue");
              }
          }
          #endregion
  
          public DropDown()
          {
              InitializeComponent();
              DataContext = this;
  
              Loaded += new RoutedEventHandler(DropDown_Loaded);
          }
  
          void DropDown_Loaded(object sender, RoutedEventArgs e)
          {
              GetDropDownValues();
          }
  
          void GetDropDownValues()
          {
              switch (ItemTypeIdCode)
              {
                  case "addresses":
                      DropDownValues.Add(new KeyValuePair&lt;string, string&gt;("111", "762 Main St."));
                      DropDownValues.Add(new KeyValuePair&lt;string, string&gt;("222", "7384 First Ave."));
                      DropDownValues.Add(new KeyValuePair&lt;string, string&gt;("333", "8728 Second St."));
                      break;
                  case "customers":
                      DropDownValues.Add(new KeyValuePair&lt;string, string&gt;("672", "Jim Smith"));
                      DropDownValues.Add(new KeyValuePair&lt;string, string&gt;("281", "James Anders"));
                      DropDownValues.Add(new KeyValuePair&lt;string, string&gt;("321", "Angie Wonderson"));
                      DropDownValues.Add(new KeyValuePair&lt;string, string&gt;("221", "Hal Cloud"));
                      DropDownValues.Add(new KeyValuePair&lt;string, string&gt;("123", "Hugh Brandley"));
                      break;
                  default:
                      break;
              }
          }
  
  
          #region INotifiedProperty Block
          public event PropertyChangedEventHandler PropertyChanged;
  
          protected void OnPropertyChanged(string propertyName)
          {
              PropertyChangedEventHandler handler = PropertyChanged;
  
              if (handler != null)
              {
                  handler(this, new PropertyChangedEventArgs(propertyName));
              }
          }
          #endregion
  
  
      }
  }
  </code></pre>