2012-08-10 41 views
17

Tôi đang điên mất cố gắng để có được điều này để làm việc với ngay cả những ví dụ cơ bản nhất. Tôi không thể cho cuộc sống của tôi có được ràng buộc để làm việc. Đây là một ví dụ siêu dễ dàng mà không làm việc cho tôi. Tôi PHẢI làm điều gì đó không chính xác.Tùy chỉnh kiểm soát phụ thuộc tài sản ràng buộc

My Custom Control kiểm soát thư viện lắp ráp của tôi:

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

Và mẫu XAML của nó:

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

Đây là XAML tốn nhiều sự kiểm soát trong một cửa sổ WPF với một tham chiếu đến thư viện kiểm soát của tôi:

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

Và đây là mã đằng sau:

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

Chạy ví dụ này mang lại cho tôi bốn phiên bản kiểm soát, tuy nhiên tôi chỉ thấy TextBlock "Thử nghiệm ..." trên mỗi. Nhãn của tôi không bao giờ bị ràng buộc. Tôi đang hiểu lầm và làm gì sai?

Trả lời

21

Bạn chưa đặt nguồn ràng buộc phù hợp. Bạn có thể sẽ phải thiết lập RelativeSource:

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

Hoặc sử dụng TemplateBinding:

<Label Content="{TemplateBinding TestProp}"/> 
Các vấn đề liên quan