使用ObjectDataProvider

Ale*_*dra 3 wpf xaml objectdataprovider app.xaml

我无法相信没有人能够克服这个问题,或者我只是错过了一些东西.

我有一个自定义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);
}
Run Code Online (Sandbox Code Playgroud)

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

<ObjectDataProvider ObjectType="{x:Type data:DataSourceController}" x:Key="DataSource" MethodName="GetVenues" />
Run Code Online (Sandbox Code Playgroud)

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

这是可能吗?或者我不得不求助于我想要数据绑定的每个控件的代码内DataContext属性?!

Rob*_*nee 5

您可以添加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);
}
Run Code Online (Sandbox Code Playgroud)

ObjectInstance 可以采取资源:

<ObjectDataProvider ObjectInstance="{StaticResource myDataController}" x:Key="DataSource" MethodName="GetVenues" />
Run Code Online (Sandbox Code Playgroud)

如果您ObjectDataProvider在App.xaml中可能会在DataSourceController添加资源之前解析它,可能会出现问题,在这种情况下您会收到错误,因为" myDataController"资源尚不存在.