2008-09-16 3 views
1

Ich habe eine benutzerdefinierte Komponente, wo ich INotifyPropertyChanged und IBindableComponent implementiert habe.Databinding ApplicationSettings zu benutzerdefinierten Komponenten

Allerdings, wenn ich versuche, eine Eigenschaft Databind, fügt der Designer diese Linie:

this.component11.TestString = 
global::WindowsFormsApplication2.Properties.Settings.Default.Setting; 

stattdessen eine Bindung wie sie mit einem Text zu schaffen:

this.textBox2.DataBindings.Add(new System.Windows.Forms.Binding(
    "Text", 
    global::WindowsFormsApplication2.Properties.Settings.Default, 
    "Setting2", 
    true, 
    System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); 

hätte ich dachte der Designer würde einfach schauen, ob IBindableComponent implementiert ist und wenn es ist, generieren Sie die bindende Codierung anstelle des Zuordnungscodes.

Irgendwelche Ideen, warum dies mit einem Textfeld und nicht meine benutzerdefinierte Komponente funktioniert?

Hier ist meine eigene Komponente:

public partial class Component1 : Component, INotifyPropertyChanged, IBindableComponent 
    { 
     public Component1() 
     { 
      InitializeComponent(); 
     } 

     public Component1(IContainer container) 
     { 
      container.Add(this); 

      InitializeComponent(); 
     } 

     private string teststring; 
     [Bindable(true)] 
     public string TestString 
     { 
      get 
      { 
       return teststring; 
      } 
      set 
      { 
       if (teststring != value) 
       { 
        teststring = value; 
        FirePropertyChanged("TestString"); 
       } 
      } 
     } 

     #region INotifyPropertyChanged Members 

     public event PropertyChangedEventHandler PropertyChanged; 

     void FirePropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     #endregion 

     #region IBindableComponent Members 

     private BindingContext bindingContext = null; 

     public BindingContext BindingContext 
     { 
      get 
      { 
       if (null == bindingContext) 
       { 
        bindingContext = new BindingContext(); 
       } 

       return bindingContext; 
      } 
      set { bindingContext = value; } 
     } 

     private ControlBindingsCollection databindings; 

     public ControlBindingsCollection DataBindings 
     { 
      get 
      { 
       if (null == databindings) 
       { 
        databindings = new ControlBindingsCollection(this); 
       } 
       return databindings; 
      } 
      set { databindings = value; } 
     } 

     #endregion 
    } 

print("code sample"); 

Antwort

2

Versuchen:

[ DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), 
    EditorBrowsable(EditorBrowsableState.Advanced), 
    Browsable(false) ] 
public BindingContext BindingContext { 
    ... 
} 

[ ParenthesizePropertyName(true), 
    RefreshProperties(RefreshProperties.All), 
    DesignerSerializationVisibility(DesignerSerializationVisibility.Content), 
    Category("Data") ] 
public ControlBindingsCollection DataBindings { 
    ... 
} 
+0

Dies schien nicht zu arbeiten, erzeugt der Designer noch den Code: this.component11.TestString = global: : TestApplicationSettings.Properties.Settings.Default.TestSetting; Anstelle des korrekten Bindungscodes. Irgendwelche anderen Ideen anzusehen? Danke für die Beantwortung. – Clint

+0

Warte, das funktioniert. Ich musste nur meine Komponente neu kompilieren, löschen und neu hinzufügen, nachdem ich die vorgeschlagenen Änderungen vorgenommen hatte. Vielen Dank! – Clint

Verwandte Themen