2012-05-15 4 views
1

Я довольно новичок в Silverlight.Silverlight - DataContext, DataGrid, WCF и добавление элементов программно со связыванием

У меня есть usercontrol с datagrid и другими элементами формы. Я пытаюсь добиться привязки программно, загружая данные из службы WCF.

это то, что у меня есть, я не знаю, как на самом деле заставить его работать:

public class DepartmentObject 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public IEnumerable<Person> People { get; set; } 
}  

public partial class DepartmentView : UserControl 
{ 
    ObservableCollection<Person> LocalPeople { get; set; } 
    Service1Client client = new Proj.ServiceReference1.Service1Client(); 

    public TemplateView(Guid departmentId) 
    { 
     InitializeComponent(); 

     client.GetDeptCompleted += (sender, e) => 
     { 
      this.DataContext = e.Result; //DepartmentObject w/People member IEnumerable<Person> 

      this.peopleList.SetBinding(DataGrid.ItemsSourceProperty, new Binding("People")); 

      LocalPeople = new ObservableCollection<Person>(e.Result.People); 
     }; 

     client.GetDeptAsync(departmentId); 
    } 


    private void Add_Person_Click(object sender, RoutedEventArgs e) 
    { 
     LocalPeople.Add(new Person() { Name = String.Format("Person [{0}]", LocalPeople.Count) }); 
    } 
} 

Теперь я понимаю, почему он не работает - нет «связи» между наблюдаемой коллекцией и контекст данных, но каков правильный способ сделать это?

peopleList - это DataGrid, который будет иметь вторичное связывание при выборе человека.

Я хочу, чтобы в последний момент смог нажать «Сохранить» и получить все, что изменилось в DepartmentObject.

Я прошел через много примеров, и все примеры SL 2-3-4 различны и сбивают с толку.

ответ

0

Я не уверен, будет ли e.Result сохранена. Должны работать следующие:

client.GetDeptCompleted += (sender, e) => 
{ 
    LocalPeople = new ObservableCollection<Person>(e.Result.People); 
    this.peopleList.DataContext = LocalPeople; //DepartmentObject w/People member IEnumerable<Person> 
    this.peopleList.SetBinding(DataGrid.ItemsSourceProperty, new Binding(".")); 
}; 

Установить точку останова после того, как LocalPeople был назначен, чтобы убедиться, что коллекция не пуста.

+0

Спасибо, это работает и добавление нового Человека также работает. Что делать, если я хочу иметь возможность редактировать и сохранять 'DepartmentObject.Name' (или любые дополнительные свойства) - что является правильным способом сделать все« видимым »? – Madd0g

+0

WCF Ria Services обеспечивает отслеживание изменений на стороне клиента, полностью сохраняя данные на стороне сервера. Это разумно способно. –

Смежные вопросы