【问题标题】:How to Bind a WPF control to a WCF method using an ObjectDataProvider如何使用 ObjectDataProvider 将 WPF 控件绑定到 WCF 方法
【发布时间】:2009-05-04 20:53:50
【问题描述】:

我是第一次测试 WPF,我正在尝试使用 ObjectDataProvider 调用 WCF 服务。

使用单一方法命名为 WcfService1 的 WCF 服务:

namespace WcfService1
{
    public class Service1 : IService1
    {

        public String HelloWorld()
        {
            return "Hello World!";
        }
    }
}

我向我的 WPF 项目添加了一个服务引用并将其命名为 TestService

在我的主窗口中,我可以在后面的代码中毫无问题地调用它。看起来很简单;就像一个网络服务调用:

TestService.Service1Client 服务 = new TestService.Service1Client(); MessageBox.Show(service.HelloWorld());

我正在尝试创建一个指向该服务的 ObjectDataProvider。我想我对 ObjectType 应该是什么感到困惑?我试过本地,服务命名空间,src;我迷路了:

<Window.Resource>
    <ObjectDataProvider 
        x:Key="odpTestService" 
        ObjectType="{x:Type **TestService**:Service1Client}" 
        MethodName="HelloWorld" />
</Window.Resources>

最终它将绑定到 TextBlock:

<TextBlock Grid.Column="0" Grid.Row="0" 
Grid.ColumnSpan="2" Background="AliceBlue"
Text="{Binding Source={StaticResource odpTestService}}" />

我试图从此处发布的 Flickr 示例开始工作:http://khason.net/blog/wpf-binding-to-wcf-and-more/

更新: 丹尼斯的回答确实解决了这里的部分问题。现在,我在编译时遇到错误: System.Windows.Data 错误:34:ObjectDataProvider:尝试调用类型上的方法失败;

ObjectDataProvider 无法调用类型为 IService1 的 HelloWorld 方法(使用我示例中的方法和类型)。任何想法为什么?

【问题讨论】:

    标签: wpf wcf binding


    【解决方案1】:

    您需要通过文件顶部的 xmlns 指令导入服务的命名空间:

    假设引用已直接添加到您的应用程序,并且您的应用程序的根命名空间是“MyApplication”:

    <Window x:class="MyApplication.MyWindow"
            xmlns:srv="MyApplication.TestService">
    
            <Window.Resource>
                <ObjectDataProvider 
                    x:Key="odpTestService" 
                    ObjectType="{x:Type srv:Service1Client}" 
                    MethodName="HelloWorld" />
            </Window.Resources>
    
            <TextBlock Grid.Column="0" Grid.Row="0" 
              Grid.ColumnSpan="2" Background="AliceBlue"
              Text="{Binding Source={StaticResource odpTestService}}" />
    
    </Window>
    

    【讨论】:

    • 丹尼斯,运行我的应用程序时,我注意到对象窗口中出现错误“System.Windows.Data 错误:34:ObjectDataProvider:尝试调用类型上的方法失败;方法='GetData';类型='IPhoenixText';"。 IPhoenixText 是 ServiceContract 接口。那是对的吗?类型是接口而不是类?
    • 看起来有点奇怪。您是如何设置 ObjectDataProvider 的?
    • - 我尝试将 Service1Client 设为该类型,这阻止了我从编译。 - 我尝试将接口 IService1 设置为类型并生成调用方法失败错误。我怀疑这可能是 app.config 的问题,但这是通过添加 WCF 服务为我自动生成的。
    • 真的应该是具体的类,而不是接口,否则ObjectDataProvider在调用方法之前根本无法知道要实例化什么类。将其设置为 srv:Service1Client 会发生什么?你说它会阻止你编译,但你得到了什么错误?
    • 当我使用 Service1Client 类时,我收到此错误:“找不到引用合同的默认端点元素”。这是一个设计时错误,让我相信这是一个应用配置问题。
    猜你喜欢
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多