Bindung der Abhängigkeitseigenschaften für benutzerdefinierte Steuerelemente

Ich werde verrückt, wenn ich versuche, dies auch mit dem einfachsten Beispiel zum Laufen zu bringen. Ich kann nicht für mein ganzes Leben zur Arbeit verpflichtet werden. Hier ist ein super einfaches Beispiel, das bei mir nicht funktioniert. Ich muss etwas falsch machen.

Mein benutzerdefiniertes Steuerelement in meiner Steuerungsbibliotheksassembly:

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)));
    }
}

Und seine XAML-Vorlage:

<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>

Hier ist die XAML, die das Steuerelement in einem WPF-Fenster mit einem Verweis auf meine Steuerelementbibliothek verwendet:

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

Und hier ist der Code dahinter:

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" },
        };
    }
}

Durch Ausführen dieses Beispiels erhalte ich vier Instanzen des Steuerelements, auf jedem wird jedoch nur der TextBlock "Testen ..." angezeigt. Mein Etikett ist nie gebunden. Was verstehe und tue ich falsch?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage