2009-12-17 9 views
1

La liaison de données dans WPF/Silverlight s'articule autour des propriétés de dépendance, des objets DataContext et des objets DataSource. Autant que je peux dire, les propriétés de dépendance sont la même chose que les propriétés ambiantes et leur signification à la liaison est fondamentalement que si vous mettez un tas de widgets dans un conteneur, vous devez seulement spécifier un DataContext pour le conteneur.DomainDataSource, liaison et curseurs

Il y a plusieurs parties à cette question.

  1. Quelle est la différence entre DataContext et DataSource, et comment ils ne se rapportent?
  2. Qu'est-ce qui gère les curseurs dans la liaison de données WPF/Silverlight? Existe-t-il une équivalence directe avec les WinForms CurrencyManager et BindingContext?
  3. Comment puis-je manipuler un Cursor dans une liaison de données WPF/Silverlight?

DataGrid semble avoir une propriété CurrentItem. Si vous liez un groupe de widgets aux différentes colonnes d'une source de données et qu'ils partagent le même datacontext que la grille de données, le déplacement interactif de la ligne sélectionnée dans la grille de données modifie la ligne dont les valeurs sont exprimées dans les widgets. Quelqu'un peut-il s'il vous plaît m'expliquer comment tout cela s'accorde? De préférence en référence à SL4.

Quand je fais cela:

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

Je reçois cette erreur de compilation:

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 

qui semble facile à résoudre, mais lorsque je tente d'ajouter une référence au projet d'argent la liste des références est vide; il est probable que l'on se limite aux ensembles que Silverlight déploie sur l'ordinateur cible. Alors maintenant qu'est-ce que je fais?

Répondre

2

J'ai trouvé quelques réponses, donc en l'absence d'une contribution utile de quelqu'un d'autre je répondrai à ma propre question. Un DataContext est un type d'objet curseur.

Vous affectez à la propriété DataContext tout objet ou collection IEnumerable d'objets à lier, et un wrapper est construit autour de lui. Si vous affectez un IEnumerable, le DataContext enveloppe une propriété CurrentItem qui fait référence à l'un des éléments de IEnumerable. Si vous affectez quelque chose qui n'est pas un IEnumerable, l'encapsuleur DataContext se comporte comme s'il construisait un IEnumerable et ajoutait votre objet à la collection, puis procédait comme si c'était ce que vous aviez passé en premier lieu, l'objet étant configuré comme CurrentItem.

Un IEnumerable possible est DomainDataSource, pour lequel DataSource est une base clase.

Chaque widget de Silverlight possède une propriété DataContext. En général, vous ne définissez pas cela directement, en raison de ce que Microsoft a appelé les "propriétés de dépendance" qui, pour autant que je sache, sont exactement les mêmes que les propriétés ambiantes, c'est-à-dire qu'elles héritent une valeur du conteneur immédiat, qui peut à son tour en hériter. Ainsi, au lieu de définir le même IEnumerable que DataContext sur un tas de widgets, vous en faites tous les enfants de certains conteneurs et définissez le DataContext pour cela, et ils sont tous liés miraculeusement au même curseur.

Vous pouvez créer un nouvel objet DataContext dans XAML simplement en le spécifiant explicitement; cela crée une nouvelle instance et l'affecte à la propriété DataContext du widget sur lequel vous l'avez spécifié; ceci est une nouvelle instance, un nouveau curseur indépendant de tout autre DataContext.

Dans Silverlight4, vous pouvez référencer le DataContext utilisé par un autre objet; voir la liaison d'élément.

Mais une liaison n'est que partiellement spécifiée par un DataContext. Après avoir spécifié un DataContext pour qu'un widget ait un objet foo contribuant son contexte, spécifier un chemin de liaison de A recherchera une propriété nommée A sur l'objet foo et si cela est trouvé, sa valeur sera masquée vers et depuis votre widget.

Ce qui est vraiment déroutant pour le débutant est que si l'ensemble de liaison peut être spécifié dans un seul endroit, normalement le contexte est miles spécifiés loin une grande hiérarchie de conteneurs complexe, et juste le chemin est spécifié sur chaque widget encore pour (par exemple) lier la ItemsSource d'une liste déroulante à une table de recherche vous spécifier le tout. J'espère avoir rendu le tout un peu plus clair pour ceux qui suivent mes traces.

Quant à l'emplacement de l'insaisissable 'System.Windows.Data', il est en% ProgramFiles% \ Microsoft SDKs \ Silverlight \ v4.0 \ Libraries \ Client \ System.Windows.Data.dll