2009-03-12 6 views
3

Ich kann nicht glauben, dass niemand über dies gekommen ist oder vielleicht nur etwas vermisse.Verwenden von ObjectDataProvider

Ich habe einen benutzerdefinierten DataSourceController, der das Abrufen von Daten und das Bereitstellen für die übrigen Anwendungssteuerelemente übernimmt. Natürlich verwendet es sql Verbindung, die ich auch initialisiere.

Meine App-Code:

private ISQLConnection conn; 
public ISQLConnection SqlConnection { get { return conn; } } 

private DataSourceController dataSource; 
public DataSourceController DataSource { get { return dataSource; } } 

protected override void OnStartup(StartupEventArgs e) { 
    //------------------------------------------------------- 
    // Initialize connections 
    conn = new OracleSQLConnection("connectionStringHere"); 

    //------------------------------------------------------- 
    // Initialize controllers 
    //dataSource = new DataSourceController(conn); 

    base.OnStartup(e); 
} 

Jetzt möchte ich Object in XAML erstellen und es dann zum Binden von Daten in Steuerelemente verwenden:

<ObjectDataProvider ObjectType="{x:Type data:DataSourceController}" x:Key="DataSource" MethodName="GetVenues" /> 

Das Problem ist, dass die DataSourceController kein hat parameterloser Konstruktor und erfordert die Übergabe eines OracleSQLConnection-Objekts (eine öffentliche Eigenschaft in meinem App-Code-Behind).

Ist das überhaupt möglich? Oder ich muss auf die DataContext-Eigenschaft in Code für jedes Steuerelement zurückgreifen, das ich binden möchte ?!

Antwort

5

Sie können die DataSourceController als Ressource hinzufügen (Sie werden dies tun müssen, um aus dem Code-behind, wenn Sie nicht über einen parameterlosen Konstruktor haben), um die ObjectDataProvider.ObjectInstance Eigenschaft und verwenden Sie die DataSourceController Instanz zu erhalten, dann können Sie Methoden ausführen darauf:

private ISQLConnection conn; 
public ISQLConnection SqlConnection { get { return conn; } } 

private DataSourceController dataSource; 
public DataSourceController DataSource { get { return dataSource; } } 

protected override void OnStartup(StartupEventArgs e) { 
    //------------------------------------------------------- 
    // Initialize connections 
    conn = new OracleSQLConnection("connectionStringHere"); 

    //------------------------------------------------------- 
    // Initialize controllers 
    dataSource = new DataSourceController(conn); 
    this.Resources.Add("myDataController", dataSource); 
    base.OnStartup(e); 
} 

ObjectInstance kann eine Ressource nehmen:

<ObjectDataProvider ObjectInstance="{StaticResource myDataController}" x:Key="DataSource" MethodName="GetVenues" /> 

es könnte Probleme, wenn Ihr ObjectDataProvider in App.xaml ist, wo es vor demanalysiert werden konnte 0 Ressource hinzugefügt, in diesem Fall erhalten Sie eine Fehlermeldung, da die "myDataController" Ressourcen noch nicht vorhanden sind.

+0

Danke Robert! Ich habe es versucht und es hat funktioniert! Obwohl ich später einige (nicht verwandte) Probleme hatte, musste ich mich für In-Code-Init entscheiden und dann das Objekt als DataContext meines Fensters setzen. – Alexandra