2009-04-03 18 views
19

Objective-c/cacao bietet eine Form der Bindung, bei der die Eigenschaften eines Steuerelements (dh Text in einem Textfeld) an die Eigenschaft eines Objekts gebunden werden können. Ich versuche, diese Funktionalität in C# w/.Net 3.5 zu duplizieren.Datenbindung an ein Objekt in C#

Ich habe die folgende sehr einfache Klasse in der Datei MyClass.cs erstellt:

class MyClass 
{ 
    private string myName; 

    public string MyName 
    { 
     get 
     { 
      return myName; 
     } 

     set 
     { 
      myName = value; 
     } 
    } 

    public MyClass() 
    { 
     myName = "Allen"; 
    } 
} 

ich auch ein einfaches Formular mit 1 Textbox und 1-Taste erstellt. Ich habe eine Instanz von Myclass innerhalb des Formularcodes initiiert und das Projekt erstellt. Unter Verwendung des DataSource-Assistenten in Vs2008 habe ich ausgewählt, um eine Datenquelle basierend auf Objekt zu erstellen, und die MyClass-Assembly ausgewählt. Dies erstellt eine Datenquellenentität. Ich habe die Datenbindung der Textbox in diese Datenquelle geändert; Das erwartete Ergebnis (dass der Inhalt der Textbox "Allen" wäre) wurde jedoch nicht erreicht. Durch das Einfügen von Text in das Textfeld wird die Namenseigenschaft des Objekts nicht aktualisiert.

Ich weiß, dass ich etwas Grundlegendes hier vermisse. Irgendwann müsste ich meine Instanz der MyClass-Klasse, die ich im Formularcode initialisiert habe, an die Textbox binden, aber das ist nicht passiert. Alles, was ich online angeschaut habe, scheint mit DataBinding mit einem Objekt zu glänzen (oder ich vermisse die Marke komplett), so dass jede Hilfe sehr geschätzt wird.

Edit:

Verwendung, was ich mit den Antworten gelernt, ich auf den Code sah von Visual Studio generiert, hatte es die folgenden:

this.myClassBindingSource.DataSource = typeof(BindingTest.MyClass); 

wenn ich das kommentieren und Ersatz:

this.myClassBindingSource.DataSource = new MyClass(); 

Ich bekomme das erwartete Verhalten. Warum wird der von VS generierte Standardcode so wie er ist? Angenommen, dies ist korrekter als die Methode, die funktioniert, wie soll ich meinen Code ändern, um innerhalb der Grenzen dessen zu arbeiten, was VS generiert hat?

public class MyClass : INotifyPropertyChanged 
{ 
    private string _myName; 

    public string MyName 
    { 
     get { return _myName; } 
     set 
     { 
      if(_myName != value) 
      { 
       _myName = value; 
       OnPropertyChanged("MyName"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

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

Diese Schnittstelle ist erforderlich für die Databinding-Infrastruktur, wenn Sie einfache Datenbindung unterstützen:

+0

Der Standardcode wird auf diese Weise behandelt, damit zur Entwurfszeit alle Steuerelemente die verschiedenen Arten von Eigenschaften kennen, die für die Datenbindung zur Verfügung stehen. Zur Laufzeit benötigen Sie jedoch eine tatsächliche Instanz. Entfernen Sie nicht den automatisch generierten Code, sondern setzen Sie einen neuen Wert in Ihrem Formular onload oder soemthing –

Antwort

15

Sie müssen die Datenquelle des Textfeldes der neuen Datenquelle zuweisen. Zusätzlich müssen Sie die Datenquelle der Datenquelle einer Instanz Ihrer Klasse zuordnen.

MyDataSource.DataSource = new MyClass(); 
TextBox1.DataSource = MyDataSource; 

Das sollte für Ihren ersten Durchlauf funktionieren. Wie andere bereits erwähnt haben, müssen Sie möglicherweise zusätzliche Schnittstellen für Ihre Klasse implementieren (INotifyPropertyChanged usw.), wenn Sie die Klasseneigenschaften über Hintergrundprozesse ändern möchten.

Wenn Sie nur die Eigenschaften über das Formular aktualisieren, benötigen Sie diesen Schritt nicht.

+3

TextBox1.DataBindings.Add ("Text",> Ihr Objekt <, "> PropertyName <"); –

12

Sie sollten die INotifyPropertyChanged Schnittstelle zu Ihrem MyClass Typ implementieren. Die INotifyPropertyChanged-Schnittstelle wird verwendet, um eine "Bindung" zu melden, dass sich eine Eigenschaft geändert hat, sodass die DataBinding-Infrastruktur entsprechend darauf reagieren kann.

Anschließend können Sie die MyName-Eigenschaft an die Texteigenschaft des Textfelds anhängen.

0

Sieht aus wie Sie wahrscheinlich ein Bindable Attribut auf MyName Eigenschaft benötigen (und Frederik Vorschlag auch folgen):

[System.ComponentModel.Bindable(true)] 
    public string MyName 
    { 
     get { return _myName; } 
     set 
     { 
      if(_myName != value) 
      { 
       _myName = value; 
       OnPropertyChanged("MyName"); 
      } 
     } 
    } 

Via: http://support.microsoft.com/kb/327413

0

Ich habe keinen Code vor mir , aber ich denke, die Datenquelle ähnelt einer Sammlung. Sie müssen der Datenquelle eine Instanz von MyClass hinzufügen, und an diese werden die Formularfelder gebunden. Es gibt auch Methoden zum Navigieren durch die Datenquelle zu mehreren Instanzen von MyClass, aber es klingt nicht so, als würden Sie das brauchen. Überprüfen Sie die Dokumentation für DataSource.

Ich glaube nicht, dass Sie irgendwelche ausgefallenen Schnittstellen implementieren müssen. Ich erinnere mich, dass es eine Methode in der Datenquelle gibt, mit der Sie das aktuelle Element aktualisieren oder neu binden können, nachdem Sie einige Werte geändert haben.

3

Ich erhalte eine Fehlermeldung in der DataBinding.Add("TEXT", myObject, myObjectProperty) Methode

Dies ist wahrscheinlich, weil Sie das explizite sind vermisst {get; set;} auf dem Grundstück Erklärung!

BAD:

public string FirstName; //<-- you will not be able to bind to this property! 

GUT:

public string FirstName { get; set; } 
+0

public string FirstName; definiert ein Feld, keine Eigenschaft Sie haben Recht, dass Sie nicht an ein Feld binden können, aber es ist keine "explizit deklarierte Eigenschaft" "öffentliche Zeichenfolge FirstName;" ist überhaupt keine Eigenschaft! Wenn ich etwas vorschlagen kann Wenn Sie die spezifische Fehlermeldung, die Sie erhalten haben, kopieren und einfügen können, hilft Ihnen vielleicht jemand bei der Suche nach Ihrem Beitrag. Vielen Dank für Ihren Beitrag. Ich bin mir sicher, dass Ihre Notiz jemandem helfen wird! –

0
using System.Collections.Generic; 

public class SiteDataItem 
{ 
private string _text; 
private string _url; 
private int _id; 
private int _parentId; 

public string Text 
{ 
    get 
    { 
     return _text; 
    } 
    set 
    { 
     _text = value; 
    } 
} 

public string Url 
{ 
    get 
    { 
     return _url; 
    } 
    set 
    { 
     _url = value; 
    } 
} 
public int ID 
{ 
    get 
    { 
     return _id; 
    } 
    set 
    { 
     _id = value; 
    } 
} 
public int ParentID 
{ 
    get 
    { 
     return _parentId; 
    } 
    set 
    { 
     _parentId = value; 
    } 
} 
public SiteDataItem(int id, int parentId, string text, string url) 
{ 
    _id = id; 
    _parentId = parentId; 
    _text = text; 
    _url = url; 
} 

public static List<SiteDataItem> GetSiteData() 
{ 
    List<SiteDataItem> siteData = new List<SiteDataItem>(); 
    siteData.Add(new SiteDataItem(1, 0, "All Sites", "")); 
    siteData.Add(new SiteDataItem(2, 1, "Search Engines", "")); 
    siteData.Add(new SiteDataItem(3, 1, "News Sites", "")); 
    siteData.Add(new SiteDataItem(4, 2, "Yahoo", "http://www.yahoo.com")); 
    siteData.Add(new SiteDataItem(5, 2, "MSN", "http://www.msn.com")); 
    siteData.Add(new SiteDataItem(6, 2, "Google", "http://www.google.com")); 
    siteData.Add(new SiteDataItem(7, 3, "CNN", "http://www.cnn.com")); 
    siteData.Add(new SiteDataItem(8, 3, "BBC", "http://www.bbc.co.uk")); 
    siteData.Add(new SiteDataItem(9, 3, "FOX", "http://www.foxnews.com")); 
    return siteData; 
} 
} 

Weitere Details Sie Tutorial dapfor lesen kann. com

Verwandte Themen