2012-08-10 16 views
17

Sto impazzendo cercando di farlo funzionare anche con l'esempio più semplice. Non posso per la vita di me impegnarmi a lavorare. Ecco un esempio semplicissimo che non funziona per me. DEVO fare qualcosa di sbagliato.Legame proprietà dipendenza controllo personalizzato

mio controllo personalizzato nel mio controllo assembly di libreria:

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

E il suo modello di 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> 

Ecco il codice XAML che consumano il controllo in una finestra di WPF con un riferimento alla mia libreria di controllo:

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

Ed ecco il codice dietro:

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

L'esecuzione di questo esempio mi dà quattro istanze del controllo, tuttavia vedo solo "Test ..." TextBlock su ciascuna. La mia etichetta non è mai vincolata. Che cosa sto fraintendendo e facendo erroneamente?

risposta

21

Non è stata impostata la sorgente di rilegatura corretta. Si dovrebbe attuare una politica impostare RelativeSource:

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

Oppure utilizzare TemplateBinding:

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