2009-12-17 57 views
1

WPF/Silverlight中的數據綁定圍繞依賴項屬性,DataContext對象和DataSource對象。據我所知,依賴項屬性與環境屬性是一樣的,它們對綁定的重要性基本上是,如果你在容器中放置了一堆小部件,那麼你只需要爲容器指定DataContextDomainDataSource,綁定和遊標

這個問題有幾個部分。

  1. DataContextDataSource有什麼不同?它們是如何相關的?
  2. 什麼管理WPF/Silverlight數據綁定中的遊標?是否有直接等價於WinForms CurrencyManagerBindingContext
  3. 如何在WPF/Silverlight數據綁定中操作Cursor

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 

這聽起來很容易解決,但是當我嘗試添加一個參考銀色項目引用列表是空的;大概只有Silverlight部署到目標計算機的那些程序集。那麼現在我該怎麼做?

回答

2

我發現了一些答案,因此在沒有任何其他人的有用貢獻時我會回答我自己的問題。

DataContext是一種遊標對象。您將指定給DataContext屬性的任何對象或要綁定到的對象的IEnumerable集合,並在其周圍構造一個包裝器。如果您分配了一個IEnumerable,則DataContext將顯示一個引用IEnumerable的其中一個元素的CurrentItem屬性。如果您指定了不是IEnumerable的東西,那麼DataContext包裝器的行爲就好像它構造了一個IEnumerable並將您的對象添加到集合中,然後繼續進行,就好像那是您首先傳遞的東西,該對象被設置爲CURRENTITEM。

一個可能的IEnumerable是DomainDataSource,DataSource是其基礎類。

Silverlight中的每個窗口小部件都有一個DataContext屬性。一般情況下,你不要直接設置這個,因爲微軟已經調用了「依賴屬性」,據我所知,它和環境屬性完全一樣,也就是說,除非你明確地設置它們,否則它們「繼承」來自直接容器的值,其可能繼而如此繼承。因此,不是在一堆小部件上設置與DataContext相同的IEnumerable,而是將它們設置爲某個容器的所有子項併爲其設置DataContext,並且它們都奇蹟般地綁定到相同的遊標上。

只需通過顯式指定它,您就可以在XAML中創建一個新的DataContext對象;這將創建一個新實例並將其分配給您指定它的窗口小部件的DataContext屬性;這是一個新的實例,一個獨立於任何其他DataContext的新遊標。

在Silverlight4中,您可以引用另一個對象使用的DataContext;請參閱元素綁定。

但是綁定只是由DataContext部分指定的。指定了一個DataContext以便一個小部件具有對象foo貢獻它的上下文,指定一個A的綁定路徑將在對象foo上尋找一個名爲A的屬性,如果發現這個屬性,它將在它的widget中調用它的值。

什麼是真正令人困惑的新手是,雖然整個結合可以在一個地方被指定,通常情況下是指定英里遠了一大複雜的容器層次結構,以及每個插件僅指定路徑,但爲(例如)將一個組合框的ItemsSource綁定到一個查找表指定整個事情。我希望我已經對那些追隨我腳步的人更加清楚。

至於難以捉摸的 'System.Windows.Data' 的位置,這是到%ProgramFiles%\微軟的SDK \ Silverlight的\ V4.0 \圖書館\客戶端\ System.Windows.Data.dll