DomainDataSource, привязка и курсоры - PullRequest
1 голос
/ 17 декабря 2009

Привязка данных в WPF / Silverlight вращается вокруг свойств зависимостей, DataContext объектов и DataSource объектов. Насколько я могу судить, свойства зависимостей - это то же самое, что и свойства окружения, и их значение для привязки заключается в том, что если вы помещаете кучу виджетов в контейнер, вам нужно только указать DataContext для контейнера. *

Этот вопрос состоит из нескольких частей.

  1. В чем разница между DataContext и DataSource и как они связаны?
  2. Что управляет курсорами в привязке данных WPF / Silverlight? Есть ли прямая эквивалентность WinForms CurrencyManager и BindingContext?
  3. Как мне манипулировать Cursor в привязке данных WPF / Silverlight?

DataGrid имеет свойство CurrentItem. Если вы связываете набор виджетов с различными столбцами источника данных, и они используют тот же текстовый текст, что и сетка данных, то интерактивное перемещение выбранной строки в сетке данных изменяет строку, значения которой выражены в виджетах. Может ли кто-нибудь пожалуйста объяснить мне, как все это сочетается? Желательно со ссылкой на SL4.

Когда я делаю это:

private void buttonNew_Click(object sender, RoutedEventArgs e)
{
  Guid newId = Guid.NewGuid();
  Employee emp = new Employee() { Id = newId, FirstName = "NOT SET", LastName = "NOT SET" };
  AtomDomainContext adc = employeeDomainDataSource.DomainContext as AtomDomainContext;
  DomainDataSourceView ddsv = grid1.DataContext as DomainDataSourceView;
}

Я получаю эту ошибку компиляции:

The type 'System.ComponentModel.IPagedCollectionView' is defined in an assembly 
that is not referenced. You must add a reference to assembly 'System.Windows.Data, 
Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.
D:\Argent\Views\ManageEmployees.xaml.cs, 57, 7, Argent

, что звучит легко исправить, но когда я пытаюсь добавить ссылку на проект Argent, список ссылок пуст; предположительно один ограничен теми сборками, которые Silverlight развертывает на целевом компьютере. Так что теперь мне делать?

1 Ответ

2 голосов
/ 19 декабря 2009

Я нашел несколько ответов, поэтому в отсутствие полезного вклада от других я отвечу на свой вопрос.

DataContext является своего рода объектом курсора. Вы присваиваете свойству DataContext любой объект или коллекцию IEnumerable объектов, с которыми вы хотите связать, и вокруг него создается оболочка. Если вы назначаете IEnumerable, DataContext отображает свойство CurrentItem, которое ссылается на один из элементов IEnumerable. Если вы назначаете что-то, что не является IEnumerable, обертка DataContext ведет себя так, как будто он создает IEnumerable и добавляет ваш объект в коллекцию, а затем продолжает работать так, как если бы это было то, что вы передали в первую очередь, объект устанавливается как CurrentItem.

Одним из возможных IEnumerable является DomainDataSource, для которого DataSource является базовым условием.

Каждый виджет в Silverlight имеет свойство DataContext. Как правило, вы не устанавливаете это напрямую, из-за того, что Microsoft использует для вызова «свойств зависимости», которые, насколько я могу судить, в точности совпадают со свойствами окружения, то есть, если вы не установите их явно, они «наследуют» значение из непосредственного контейнера, которое, в свою очередь, может наследоваться. Поэтому вместо того, чтобы устанавливать тот же IEnumerable, что и DataContext для нескольких виджетов, вы делаете их всех потомками какого-то контейнера и задаете для них DataContext, и все они чудесным образом связываются с одним и тем же курсором.

Вы можете создать новый объект DataContext в XAML, просто указав его; это создает новый экземпляр и присваивает его свойству DataContext виджета, для которого вы его указываете; это новый экземпляр, новый курсор, независимый от любого другого DataContext.

В Silverlight4 вы можете ссылаться на DataContext, используемый другим объектом; см. привязку элемента.

Но привязка только частично указывается DataContext. Указав DataContext, чтобы у виджета был объект foo, вносящий свой контекст, указание пути привязки A будет искать свойство с именем A в объекте foo, а если он найден, будет смешивать его значение с вашим виджетом.

Что действительно вводит в заблуждение новичка, так это то, что хотя всю привязку можно указывать в одном месте, обычно контекст задается за несколько миль вверх по большой сложной иерархии контейнеров, и только путь указывается для каждого виджет, но для (например) связывания ItemsSource комбобокса с таблицей поиска вы do указываете все это. Надеюсь, я все прояснил для тех, кто следует по моим стопам.

Что касается расположения неуловимого «System.Windows.Data», оно находится в папке% ProgramFiles% \ Microsoft SDK \ Silverlight \ v4.0 \ Libraries \ Client \ System.Windows.Data.dll

...