Использование ObjectDataProvider
-
11-07-2019 - |
Вопрос
Я не могу поверить, что никто не сталкивался с этим или, может быть, я просто что-то упустил.
У меня есть собственный DataSourceController, который обрабатывает получение данных и предоставляет их остальным элементам управления приложения. Естественно, он использует соединение SQL, которое я также инициализирую.
Код моего приложения:
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);
}
Теперь я хочу создать ObjectDataProvider в XAML, а затем использовать его для привязки данных в элементах управления:
<ObjectDataProvider ObjectType="{x:Type data:DataSourceController}" x:Key="DataSource" MethodName="GetVenues" />
Проблема в том, что DataSourceController не имеет конструктора без параметров и требует передачи объекта OracleSQLConnection (который является общедоступным свойством в коде моего приложения).
Это вообще возможно? Или я должен прибегнуть к использованию свойства DataContext в коде для каждого элемента управления, который я хочу привязать к данным?!
Решение
Вы можете добавить DataSourceController
в качестве ресурса (вам придется делать это из-за кода, если у вас нет конструктора без параметров) и использовать ObjectDataProvider.ObjectInstance для получения DataSourceController > код> экземпляр, тогда вы можете выполнять методы на нем:
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
может занять ресурс:
<ObjectDataProvider ObjectInstance="{StaticResource myDataController}" x:Key="DataSource" MethodName="GetVenues" />
Могут возникнуть проблемы, если ваш ObjectDataProvider
находится в App.xaml, где он может быть проанализирован до добавления ресурса DataSourceController
, и в этом случае вы получите ошибку потому что " myDataController
" ресурсы еще не существуют.