2009-12-08 2 views
1

Я только что обсуждал новую бета-версию WCF RIA для Silverlight. Пока это выглядит красиво, но я столкнулся с несколькими препятствиями при попытке получить данные и разоблачить их в пользовательском интерфейсе через привязку.WCF RIA Services - загрузка данных и привязка

Прежде всего, как я могу получить одно целое или строковое значение из моей службы? Скажем, если у меня есть этот метод на моем DomainService:

общественные ИНТ CountEmployees() { возвращение this.ObjectContext.Employees.Count(); }

Как я могу позвонить вам и связать результат, скажем, с TextBlock?

Кроме того, существует ли способ сделать пользовательский макет для привязки данных? Я чувствую себя немного «ограниченным» для ListBox, DataGrid и тому подобного. Как это возможно, т. Е. Создать сетку со стековой панелью внутри и иметь некоторые текстовые блоки, показывающие связанные данные? Если это вообще возможно с WCF RIA Services :)

Большое спасибо.

ответ

2

Вы можете назвать свой класс схемой classname.shared.cs, и этот код также будет доступен в приложении silverlight.

Используя механизм привязки данных Silverlight/WPF, вы можете создать любую причудливую компоновку с использованием контейнеров datagrid/listbox и обычных элементов управления, таких как текстовое поле/ярлык, и применить свой собственный стиль/скин - Example.

EDIT

Общий код не может содержать каких-либо баз данных, связанных с функциями, только некоторые простые расчеты. Если вы хотите получить это значение с сервера, вам нужно сделать вызов метода WCF.

В ServerSide вы создаете реализацию 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; 
} 

Все грязная работа с созданием класса HelloWorld доступны на Silverlight клиента выполняется Visual Studio. Проверьте скрытую сгенерированную папку кода.

Атрибут [Invoke] устарел в новейшей версии служб RIA.

+0

Фактически, файл shared.cs будет доступен как есть, и он будет только скопирован. i.e: вы не можете получить доступ к базе данных в методах этого файла. Итак, если вы хотите запросить только количество сотрудников без запроса всех данных, вы не должны помещать их в файл shared.cs – Zied

+0

Спасибо Zied.Обновленный контент. – tomo

+0

Спасибо, ребята! Делает совершенно здравый смысл :) Итак, когда вы звоните в пользовательские методы, это больше похоже на обычный вызов WCF, а не на «вызов RIA», так как [Invoke] устарел сейчас? – bomortensen

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; 
    } 
} 

Для второго вопроса, вы не ограничены с креплениями , Объект, который вы получаете из контекста, может быть привязан к любым элементам, которые вы хотите.