2012-08-10 15 views
17

मैं इसे सबसे बुनियादी उदाहरण के साथ काम करने के लिए पागल होने की कोशिश कर रहा हूं। मैं अपने जीवन के लिए काम करने के लिए बाध्यकारी नहीं कर सकता। यहां एक सुपर आसान उदाहरण है जो मेरे लिए काम नहीं कर रहा है। मुझे कुछ गलत करना होगा।कस्टम कंट्रोल निर्भरता संपत्ति बाध्यकारी

मेरा कस्टम नियंत्रण मेरे नियंत्रण पुस्तकालय विधानसभा में:

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> 

यहाँ XAML लेने मेरे नियंत्रण पुस्तकालय के लिए एक संदर्भ के साथ एक WPF विंडो में नियंत्रण:

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

इस उदाहरण को चलाने से मुझे नियंत्रण के चार उदाहरण मिलते हैं, हालांकि मुझे केवल "परीक्षण ..." प्रत्येक पर टेक्स्टब्लॉक दिखाई देता है। मेरा लेबल कभी बंधे नहीं है। मैं गलतफहमी और गलत तरीके से क्या कर रहा हूं?

उत्तर

21

आपने उचित बाध्यकारी स्रोत सेट नहीं किया है। आप RelativeSource सेट करने के लिए या तो होगा:

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

या का उपयोग TemplateBinding:

<Label Content="{TemplateBinding TestProp}"/> 
संबंधित मुद्दे