Использование ObjectDataProvider - PullRequest
3 голосов
/ 12 марта 2009

Я не могу поверить, что никто не сталкивался с этим или, может быть, я просто что-то упустил.

У меня есть собственный 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 в коде для каждого элемента управления, который я хочу привязать к данным?!

1 Ответ

5 голосов
/ 12 марта 2009

Вы можете добавить 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" не будут пока не существует.

...