2009-03-12 3 views
3

Je n'arrive pas à croire que personne ne soit passé par là ou peut-être que je manque quelque chose.Utiliser ObjectDataProvider

J'ai un DataSourceController personnalisé qui gère la récupération de données et la fournit au reste des contrôles d'application. Naturellement, il utilise la connexion sql que j'initialise aussi.

Mon code App:

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

Maintenant, je veux créer ObjectDataProvider en XAML, puis l'utiliser pour la liaison de données dans les contrôles:

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

Le problème est que le DataSourceController n'a pas Constructeur sans paramètre et nécessite la transmission d'un objet OracleSQLConnection (qui est une propriété publique dans mon code-application).

Est-ce possible? Ou je dois recourir à l'utilisation de la propriété DataContext dans le code pour chaque contrôle que je veux lier aux données ?!

Répondre

5

Vous pouvez ajouter le DataSourceController comme une ressource (vous devrez le faire à partir du code-behind si vous ne disposez pas d'un constructeur parameterless) et utiliser la propriété ObjectDataProvider.ObjectInstance pour obtenir l'instance DataSourceController, vous pouvez exécuter des méthodes dessus:

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 peut prendre une ressource:

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

il pourrait y avoir des problèmes si votre ObjectDataProvider est en App.xaml où il pourrait être analysé avant la DataSourceController ressource est ajoutée, auquel cas vous obtiendrez une erreur car les ressources "myDataController" n'existeraient pas encore.

+0

Merci Robert! Je l'ai essayé et ça marche! Bien que j'ai ensuite eu quelques problèmes (sans rapport) plus loin sur la route et ai dû désactiver pour init init-code, puis définissant l'objet en tant que DataContext de ma fenêtre. – Alexandra

Questions connexes