4

我不敢相信没有人能解决这个问题,或者我只是错过了一些东西。

我有一个自定义的 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);
}

现在我想在 XAML 中创建 ObjectDataProvider,然后用它来绑定控件中的数据:

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

问题是 DataSourceController 没有无参数构造函数,需要传入一个 OracleSQLConnection 对象(这是我的 App 代码隐藏中的公共属性)。

这是可能吗?或者我必须为每个要绑定数据的控件使用代码内 DataContext 属性?!

4

1 回答 1

6

您可以将其添加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”资源尚不存在。

于 2009-03-12T16:47:24.120 回答