2014-10-22 27 views
0

我希望能夠在單個FieldLayout應用到多個網格,它是動態的,在運行時創建的。應用XamDataGrid的FieldLayout多個動態網格

在我的應用程序中,我使用一個搜索欄輸入一個類型名稱,當一個類型中找到了一個網格將呈現顯示該類型的服務器上的所有實例。用戶應該能夠搜索不同的類型,從而用新的替換網格。

我設置在FieldLayoutSettings真AutoGenerateFields,因爲我不知道我會被顯示,直到運行時類型也和字段將跨類型不同。不過,我知道他們會共享一些我不希望在網格上顯示的字段(因爲它們都擴展了相同的抽象類)。所以我使用的是FieldLayout如下:

<igDP:XamDataGrid x:Name="MyGrid" DataSource="{Binding Items}" > 
     <igDP:XamDataGrid.FieldLayoutSettings> 
      <igDP:FieldLayoutSettings AutoGenerateFields="True"/> 
     </igDP:XamDataGrid.FieldLayoutSettings> 
     <igDP:XamDataGrid.FieldLayouts> 
      <igDP:FieldLayout IsDefault="True"> 
       <igDP:Field Name="PropertyToNotDisplay" Visibility="Collapsed"/> 
       <igDP:Field Name="AnotherPropertyToNotDisplay" Visibility="Collapsed"/> 
      </igDP:FieldLayout> 
     </igDP:XamDataGrid.FieldLayouts> 
    </igDP:XamDataGrid> 

當我在我的第一類型名稱類型,並呈現此FieldLayout作爲預期的網格;一切都很好。但是,下次我鍵入一個類型名稱並呈現網格時,根本不應用任何FieldLayout - 所有內容都會顯示,包括我希望隱藏的字段。我試圖迫使電網通過處理在網格的AssigningFieldLayoutToItem事件代碼隱藏如下使用FieldLayout:

private void MyGrid_OnAssigningFieldLayoutToItem(object sender, AssigningFieldLayoutToItemEventArgs e) 
    { 
     e.FieldLayout = MyGrid.FieldLayouts[0]; 
    } 

而且雖然這並不適用的佈局,它不會改變對電網的領域。

爲了說明會發生什麼:如果類型A有字段1,2,3,而類型B有字段2,3,4 - 當顯示類型B時,它將顯示所有類型B的實例的網格,但是類型A的字段 - 這當然沒有意義,並且缺少一些數據。我們最終得到一個帶有字段1,2,3的網格,而'1'列中的所有單元格都是空的。

它因此將顯示所創建的網格和所施加的fieldlayout的情況下,變得FieldLayout耦合到它顯示的字段。

我也曾嘗試加入FieldLayout我需要爲我的用戶資源,設置x:Shared="False"以便它可以重複使用,並增加它在後臺代碼如下所示:

MyGrid.FieldLayouts.Add(this.Resources["FieldLayout"] as FieldLayout); 

這實質上葉我與原始問題具有相同的行爲 - 佈局適用於第一個網格,然後不再用於後續網格。上述兩種解決方案的組合給我留下了上面的Grid顯示不正確字段的問題。

我只是想在現有FieldLayout相同的規則被應用到呈現的每個網格。任何幫助將非常感激!

我試圖遵循一個MVVM模式,所以理想情況下希望保持我的代碼清潔,但如果解決方案需要一些代碼隱藏,我當然願意嘗試(因爲我已經)。

謝謝!

TL;博士我換出並呈現在運行時新的網格,並且需要同FieldLayout適用於所有的人

回答

1

Infragistics的支持,回來給我。據猜測,FieldLayout與創建時綁定的類型相關聯,所以不能以這種方式重用。相反,在XAML創建FieldLayout並試圖再次使用的,一個可能的解決辦法是,從XAML擺脫FieldLayout和處理上xamDataGrid的FieldLayoutInitialized事件和隱藏屬性這種方式:

private void MyGrid_FieldLayoutInitialized(object sender, Infragistics.Windows.DataPresenter.Events.FieldLayoutInitializedEventArgs e) 
{ 
    var fld = e.FieldLayout.Fields.FirstOrDefault(f => f.Name.Equals("PropertiesToOldValues")); 
    if (fld != null) fld.Visibility = Visibility.Collapsed; 
    fld = e.FieldLayout.Fields.FirstOrDefault(f => f.Name.Equals("MagnetoProperty")); 
    if (fld != null) fld.Visibility = Visibility.Collapsed; 
} 

更多開銷,但是無論如何都需要爲每個新網格創建一個新的FieldLayout。