1

WPF/Silverlight 中的数据绑定围绕依赖属性、DataContext对象和DataSource对象展开。据我所知,依赖属性与环境属性是一样的,它们对绑定的意义基本上是如果你把一堆小部件放在一个容器中,那么你只需要为DataContext容器指定一个。

这个问题有几个部分。

  1. DataContext和和有什么区别DataSource,它们有什么关系?
  2. 什么管理 WPF/Silverlight 数据绑定中的游标?CurrencyManager是否与 WinForms和有直接等价性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 部署到目标计算机的那些程序集。那么现在我该怎么办?

4

1 回答 1

2

我找到了一些答案,所以在没有其他人有用的贡献的情况下,我会回答我自己的问题。

DataContext 是一种游标对象。您将要绑定到的任何对象或 IEnumerable 对象集合分配给 DataContext 属性,然后围绕它构造一个包装器。如果分配 IEnumerable,DataContext 会显示一个 CurrentItem 属性,该属性引用 IEnumerable 的元素之一。如果您分配的东西不是 IEnumerable,则 DataContext 包装器的行为就好像它构造了一个 IEnumerable 并将您的对象添加到集合中,然后就像您首先传递的一样继续进行,对象被设置为当前项目。

一种可能的 IEnumerable 是 DomainDataSource,DataSource 是其基类。

Silverlight 中的每个小部件都有一个 DataContext 属性。通常,您不会直接设置它,因为微软已经采取了调用“依赖属性”的方式,据我所知,它与环境属性完全相同,也就是说,除非您明确设置它们,否则它们会“继承”来自直接容器的值,它可能反过来继承。因此,不是在一堆小部件上设置与 DataContext 相同的 IEnumerable,而是让它们成为某个容器的所有子级并为此设置 DataContext,它们都奇迹般地绑定到同一个光标。

您可以在 XAML 中创建一个新的 DataContext 对象,只需显式指定它即可;这将创建一个新实例并将其分配给您指定它的小部件的 DataContext 属性;这是一个新实例,一个独立于任何其他 DataContext 的新游标。

在 Silverlight4 中,您可以引用另一个对象正在使用的 DataContext;请参阅元素绑定。

但绑定仅由 DataContext 部分指定。指定了 DataContext 以使小部件具有对象 foo 贡献其上下文,指定 A 的绑定路径将在对象 foo 上查找名为 A 的属性,如果找到该属性,则将其值混搭到您的小部件或从您的小部件中取出。

让新手真正感到困惑的是,虽然可以在一个位置指定整个绑定,但通常情况下,上下文是在一个大的复杂容器层次结构上数英里之外指定的,并且只是在每个小部件上指定了路径,但对于(例如)绑定一个组合框的 ItemsSource 到一个查找表,你确实指定了整个事情。我希望我已经让那些追随我的人更清楚了。

至于难以捉摸的“System.Windows.Data”的位置,它位于 %ProgramFiles%\Microsoft SDKs\Silverlight\v4.0\Libraries\Client\System.Windows.Data.dll

于 2009-12-19T12:07:43.230 回答