Vinculação de propriedade de dependência de controle personalizado

Estou ficando louco tentando fazer com que isso funcione mesmo com o exemplo mais básico. Eu não posso para a vida de mim se ligar ao trabalho. Aqui está um exemplo super fácil que não está funcionando para mim. Eu devo estar fazendo algo incorreto.

Meu controle personalizado no meu assembly de biblioteca de controle:

public class TestControl : Control
{
    public static readonly DependencyProperty TestPropProperty =
        DependencyProperty.Register("TestProp", typeof(string), typeof(TestControl), new UIPropertyMetadata(null));

    public string TestProp
    {
        get { return (string)GetValue(TestPropProperty); }
        set { SetValue(TestPropProperty, value); }
    }

    static TestControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(TestControl), new FrameworkPropertyMetadata(typeof(TestControl)));
    }
}

E seu modelo XAML:

<Style TargetType="{x:Type local:TestControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:TestControl}">
                <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                    <StackPanel>
                        <TextBlock Text="Testing..." />
                        <Label Content="{Binding TestProp}" Padding="10" />
                    </StackPanel>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Aqui está o XAML consumindo o controle em uma janela wpf com uma referência à minha biblioteca de controle:

<Grid>
    <ItemsControl Name="mylist">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <my:TestControl TestProp="{Binding Path=Name}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

E aqui está o código por trás:

public partial class Test2 : Window
{
    public class TestObject : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string PropertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
        }

        private int _id;
        public int id
        {
            get { return _id; }
            set { _id = value; OnPropertyChanged("id"); }
        }

        private string _Name;
        public string Name
        {
            get { return _Name; }
            set { _Name = value; OnPropertyChanged("Name"); }
        }
    }

    public Test2()
    {
        InitializeComponent();

        mylist.ItemsSource = new TestObject[]
        {
            new TestObject(){ id = 1, Name = "Tedd" },
            new TestObject(){ id = 2, Name = "Fred" },
            new TestObject(){ id = 3, Name = "Jim" },
            new TestObject(){ id = 4, Name = "Jack" },
        };
    }
}

Executar este exemplo me dá quatro instâncias do controle, no entanto, só vejo o TextBlock "Teste ..." em cada um. Minha gravadora nunca está vinculada. O que estou entendendo errado e fazendo incorretamente?

questionAnswers(1)

yourAnswerToTheQuestion