Question

Je n'arrive pas à croire que personne ne l'a compris, ou peut-être qu'il me manque quelque chose.

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

Mon code d'application:

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

Je souhaite maintenant créer ObjectDataProvider en XAML, puis l'utiliser pour lier des données dans des contrôles:

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

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

Est-ce possible? Ou je dois recourir à la propriété DataContext en code pour chaque contrôle que je souhaite lier aux données?!

Était-ce utile?

La solution

Vous pouvez ajouter le DataSourceController en tant que ressource (vous devrez le faire à partir de code-behind si vous n'avez pas de constructeur sans paramètre) et utiliser le ObjectDataProvider.ObjectInstance pour obtenir la propriété DataSourceController instance, alors 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 peut y avoir des problèmes si votre ObjectDataProvider est dans App.xaml, où il pourrait être analysé avant l'ajout de la ressource DataSourceController , auquel cas vous obtiendriez une erreur. car le " monContrôleurDonnées & "; les ressources n'existeraient pas encore.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top