我会疯狂地试图让这个工作与最基本的例子.我无法为我的生活带来约束力.这是一个超级容易的例子,不适合我.我必须做错事.
我的自定义控件在我的控制库程序集中:
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))); } }
及其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>
这是在wpf窗口中使用引用我的控制库的XAML消费控件:
<Grid> <ItemsControl Name="mylist"> <ItemsControl.ItemTemplate> <DataTemplate> <my:TestControl TestProp="{Binding Path=Name}" /> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </Grid>
这里是代码:
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" },}; } }
运行这个例子给了我四个控件的实例,但是我只看到每一个“测试…”TextBlock.我的标签永远不会被束缚.我有什么误会和做错了?
您尚未设置正确的绑定源.您将要设置
RelativeSource:
<Label Content="{Binding TestProp,RelativeSource={RelativeSource Mode=TemplatedParent}}" />
或使用TemplateBinding:
<Label Content="{TemplateBinding TestProp}"/>