使用ObjectDataProvider

时间:2009-03-12 14:38:41

标签: 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);
}

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

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

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

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

1 个答案:

答案 0 :(得分:5)

您可以将DataSourceController添加为资源(如果您没有无参数构造函数,则必须从代码隐藏中执行此操作)并使用ObjectDataProvider.ObjectInstance属性获取{ {1}}实例,然后你可以在它上面执行方法:

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" /> 位于App.xaml中,可能会在添加ObjectDataProvider资源之前对其进行解析,在这种情况下,您会收到错误,因为“{{1} “资源还不存在。