Utilizzando ObjectDataProvider
-
11-07-2019 - |
Domanda
Non riesco a credere che nessuno l'abbia superato o forse mi sto perdendo qualcosa.
Ho un DataSourceController personalizzato che gestisce il recupero dei dati e li fornisce al resto dei controlli dell'applicazione. Ovviamente, utilizza la connessione SQL che anch'io inizializzo.
Codice app personale:
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);
}
Ora voglio creare ObjectDataProvider in XAML e quindi usarlo per associare i dati nei controlli:
<ObjectDataProvider ObjectType="{x:Type data:DataSourceController}" x:Key="DataSource" MethodName="GetVenues" />
Il problema è che DataSourceController non ha un costruttore senza parametri e richiede il passaggio di un oggetto OracleSQLConnection (che è una proprietà pubblica nella mia app code-behind).
È possibile? O devo ricorrere all'uso della proprietà DataContext nel codice per ogni controllo che voglio associare ai dati ?!
Soluzione
Puoi aggiungere DataSourceController
come risorsa (dovrai farlo da code-behind se non hai un costruttore senza parametri) e usare ObjectDataProvider.ObjectInstance per ottenere la proprietà DataSourceController
istanza, quindi puoi eseguire i metodi su di essa:
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
può prendere una risorsa:
<ObjectDataProvider ObjectInstance="{StaticResource myDataController}" x:Key="DataSource" MethodName="GetVenues" />
Potrebbero esserci problemi se ObjectDataProvider
si trova in App.xaml dove potrebbe essere analizzato prima dell'aggiunta della risorsa DataSourceController
, nel qual caso si otterrebbe un errore perché il " myDataController
" le risorse non esisterebbero ancora.