2012-02-20 138 views
0

在MVVM場景中,使用linq2sql從數據庫表創建模型「Impegni」。 Wpf表單顯示所有'Impegni'字段,這是通過將視圖模型ImpegnoSelezionato暴露的類型爲'Impegni'的對象綁定到包含所有其他UI控件的網格的DataContext來實現的。 不幸的是,在表單中需要顯示更多的字段,並且其中的一部分可能直接從模型派生(例如,其中一個是兩個模型字段之間的布爾比較)。 第一種解決方案是公開視圖模型中的其他屬性。 由於在網格上每一個新的控制,顯示在視圖模型中添加的屬性設置DataContext的需求是這樣的:模型對象缺少某些屬性時的數據綁定

DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType= {x:Type Window}}, Path=DataContext.ActiveWorkspace}" 

這是一個非常奇怪的語法,對我來說,我不能相信沒有什麼簡單的使用。

我的第二個想法是爲'Impegni'模型創建一些方法擴展。這些方法不需要任何參數,並且將等同於屬性的getter方法。
經過一些網上衝浪,似乎將控件綁定到方法而不是屬性的唯一方法是使用ObjectDataProvider,但我無法找到在「ObjectType =」{x:Type ??}中寫入的內容'

第三個想法是使用一些更多的屬性重新生成模型,但正如我之前所說,它來自使用linq2sql的dfatabase表:我是newbe,我不知道是否可以添加額外的字段不在數據庫表。

因此,在我只寫了第一時間的想法已經被證明是工作,但我想的東西有點清潔。 有什麼建議?

由於 菲利普

+0

第一個選項中的語法非常好 – 2012-02-20 12:35:46

+0

在找到好奇的方式來覆蓋DataContext之前,我不得不搜索幾個小時。我希望能夠以更簡單的方式實現該目標(將特定組件的DataContext恢復爲默認值)。 – Filippo 2012-02-20 14:45:55

+0

您只需在父窗口的ViewModel中查找「ActiveworkSpace」。這沒有錯。 – 2012-02-20 15:26:57

回答

1

你可以縮短這個綁定的公平位,沒有什麼不乾淨的。

原文:

{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
             AncestorType={x:Type Window}}, 
     Path=DataContext.ActiveWorkspace} 

最小:

​​

這做了幾件事情:

  1. 使用標記擴展的構造。第一個未命名的參數作爲構造函數參數傳遞,在binding that is the path中,因此可以刪除Path=
  2. 使用隱式轉換爲Type。作爲屬性AncestorType的類型是已經Typex:Type是冗餘的,其被設置隱式,在這種情況下設定AncestorType還設置ModeFindAncestor
  3. 掉落性能。(你也可以使用一個構造函數在這裏順便說一下砸Mode=
相關問題