我今晚刚刚为Silverlight推出了新的WCF RIA服务测试版。到目前为止,它看起来很不错,但在尝试检索数据并通过绑定将其暴露给UI时,我遇到了一些障碍。
首先,我如何从我的服务中获取单个整数或字符串值?假设我的域服务上有这个方法:
public int CountEmployees() { return this.ObjectContext.Employees.Count(); }
我如何调用此函数并将结果绑定到TextBlock?
另外,有没有办法为绑定数据制作自定义布局?我觉得有点“限制”ListBox,DataGrid等。怎么可能,即在一个带有stackpanel的Grid中,并有一些TextBlocks显示绑定数据?如果可以使用WCF RIA服务:)
提前多多感谢。
答案 0 :(得分: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;
}
}
对于第二个问题,您不受限制。您从上下文中获得的对象可以与您想要的任何元素绑定。
答案 1 :(得分:2)
您可以使用架构classname.shared.cs
命名您的类,此代码也可以在silverlight应用程序中使用。
使用Silverlight / WPF数据绑定引擎,您可以使用datagrid / listbox容器和常规控件(如textbox / label)构建任何花哨的布局,并应用您自己的样式/皮肤 - Example。
修改强>
共享代码不能包含任何与数据库相关的函数,只能包含一些简单的计算。如果要从服务器检索此值,则需要进行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服务中已过时。