I am going insane trying to get this to work with even the most basic example. I cannot for the life of me get binding to work. Here is a super easy example that is not working for me. I MUST be doing something incorrect.
My Custom Control in my control library assembly:
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))); } }
And its XAML template:
<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>
Here's the XAML consuming the control in a wpf window with a reference to my control library:
<Grid> <ItemsControl Name="mylist"> <ItemsControl.ItemTemplate> <DataTemplate> <my:TestControl TestProp="{Binding Path=Name}" /> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </Grid>
And here's the code behind:
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" }, }; } }
Running this example gives me four instances of the control, however I only see the "Testing..." TextBlock on each. My label is never bound. What am I misunderstanding and doing incorrectly?
You haven't set the proper binding source. You would either have to set RelativeSource:
<Label Content="{Binding TestProp, RelativeSource={RelativeSource Mode=TemplatedParent}}" />
Or use TemplateBinding:
<Label Content="{TemplateBinding TestProp}"/>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With