【问题标题】:Using ObjectDataProvider使用 ObjectDataProvider
【发布时间】:2010-10-12 22:34:14
【问题描述】:

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

我有一个自定义的 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 属性?!

【问题讨论】:

    标签: wpf xaml objectdataprovider app.xaml


    【解决方案1】:

    您可以将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”资源不会还不存在。

    【讨论】:

    • 谢谢罗伯特!我试过了,它奏效了!尽管后来我遇到了一些(不相关的)问题,并且不得不选择退出代码内初始化,然后将对象设置为我的窗口的 DataContext。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多