1

今天晚上,我一直在玩弄 Silverlight 的新 WCF RIA 服务 Beta。到目前为止,它看起来不错,但是在尝试检索数据并通过绑定将其公开给 UI 时,我遇到了一些障碍。

首先,我如何从我的服务中获取单个整数或字符串值?假设我的域服务上有这个方法:

public int CountEmployees() { return this.ObjectContext.Employees.Count(); }

我怎样才能调用它并将结果绑定到一个TextBlock?

另外,有没有办法为绑定数据制作自定义布局?我觉得 ListBox、DataGrid 等有点“受限”。即,如何制作一个内部带有堆栈面板的 Grid 并让一些 TextBlocks 显示绑定的数据?如果 WCF RIA 服务完全有可能:)

提前非常感谢。

4

2 回答 2

3

要执行自定义方法,您可以使用该Invoke属性。在服务器端,您在这样的域服务中声明

[EnableClientAccess]
public class EmployeesService : DomainService
{
    [Invoke]
    public int CountEmployees() 
    {
        return this.ObjectContext.Employees.Count(); 
    }
}

在您的客户端中,您可以像这样使用它

EmployeesContext context = new EmployeesContext();
InvokeOperation<int> invokeOp = context.CountEmployees(OnInvokeCompleted, null);

private void OnInvokeCompleted(InvokeOperation<int> invOp)
{
  if (invOp.HasError)
  {
    MessageBox.Show(string.Format("Method Failed: {0}", invOp.Error.Message));
    invOp.MarkErrorAsHandled();
  }
  else
  {
    result = invokeOp.Value;
  }
}

对于第二个问题,您不受绑定的限制。您从上下文中获得的对象可以与您想要的任何元素绑定。

于 2009-12-08T05:53:09.827 回答
2

您可以使用模式命名您的类,classname.shared.cs并且此代码也将在 silverlight 应用程序中可用。

使用 Silverlight/WPF 数据绑定引擎,您可以使用数据网格/列表框容器和常规控件(如文本框/标签)构建任何精美的布局,并应用您自己的样式/皮肤 -示例

编辑

共享代码不能包含任何与数据库相关的函数,只能包含一些简单的计算。如果要从服务器检索此值,则需要进行 WCF 方法调用。

在服务器端,您创建 DomainService 实现:

   [EnableClientAccess()]
    public class HelloWorld : DomainService
    {
        public string SayHello()
        {
            return "Test";
        }
    }

然后你可以在客户端使用它:

    HelloWorld context = new HelloWorld();
    context.SayHello(x => context_SayHelloCompleted(x), null);

void context_SayHelloCompleted(System.Windows.Ria.InvokeOperation<string> op)
{
    HelloTextBlock.Text = op.Value;
}

在 Silverlight 客户端提供 HelloWorld 类的所有脏活都是由 Visual Studio 完成的。检查隐藏的生成代码文件夹。

[Invoke] 属性在最新版本的 RIA 服务中已过时。

于 2009-12-08T12:42:11.330 回答