wpf wpf-controls dependency-properties

wpf - Vinculación de propiedades de dependencia de control personalizado



wpf-controls dependency-properties (1)

Me estoy volviendo loco tratando de hacer que esto funcione incluso con el ejemplo más básico. No puedo, por mi vida, obligarme a trabajar. Aquí hay un ejemplo súper fácil que no me funciona. DEBO estar haciendo algo incorrecto

Mi control personalizado en el ensamblaje de mi biblioteca de control:

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

Y su plantilla 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>

Aquí está el XAML que consume el control en una ventana wpf con una referencia a mi biblioteca de control:

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

Y aquí está el código detrá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" }, }; } }

La ejecución de este ejemplo me da cuatro instancias del control, sin embargo, solo veo el TextBlock "Testing ..." en cada una. Mi etiqueta nunca está atada. ¿Qué estoy entendiendo mal y haciendo incorrectamente?


No has establecido la fuente de enlace adecuada. Tendrías que establecer RelativeSource :

<Label Content="{Binding TestProp, RelativeSource={RelativeSource Mode=TemplatedParent}}" />

O utilice TemplateBinding :

<Label Content="{TemplateBinding TestProp}"/>