2014-12-02 127 views
10

我有一個Windows 8.1應用程序與GridView綁定到自定義(可排序,重複數據刪除)可觀察集合。在這個集合中,我會進行一些重要的過濾併爲每個項目設置一個IsHidden標誌。不顯示項目與可見性=在Windows 8.1中摺疊GridView

在該項目的數據模板中,如果IsHidden標誌設置爲true,會出現使項目摺疊的條件。

<Grid Width="160" Height="280" Visibility="{Binding IsHidden, Converter={StaticResource InvertedBooleanToVisibilityConverter}}"> 

這種方法適用於Windows Phone的8.1 ​​XAML,使項目從ListView消失,但它不會在Windows 8.1 GridView工作。 Windows 8.1的問題在於,當我將集合中的項目設置爲隱藏時,id從GridView中消失但留下空位,因此GridView中存在間隙。

enter image description here

如何解決它的任何想法?也許同樣的XAML風格編輯?

這裏是一個最小的解決方案來重現問題:https://dl.dropboxusercontent.com/u/73642/gv.zip

我試着結合項目的寬度和高度,以隱藏標誌,當該項目是隱藏其設置爲0,但它並沒有幫助,還在GridView的差距。

更新:一種解決方法是過濾實際綁定的集合,但這是不可能的,因爲一些業務需求。

+0

你確定它是'Visibility.Collapsed'嗎?因爲它看起來像'Visibility.Hidden'(你肯定知道[差異](http://stackoverflow.com/q/886742/1997232))。 – Sinatr 2014-12-02 10:29:28

+0

是的,我確定沒有可見性。隱藏在winrt中 – 2014-12-02 11:11:47

+0

你用什麼作爲GridView.ItemsPanel? – 2014-12-02 19:22:45

回答

5

問題出在GridViewItemsPanel

ItemsWrapGridWrapGrid是均勻的網格。他們的所有子元素將共享相同的高度和寬度。這就是爲什麼即使你摺疊ItemTemplate,空間仍然保留。

你真正需要的是WrapPanel。 WINRT沒有內置WrapPanel,但傑里尼克森已經建立了一個,你可以從here中獲得。

更新GridView s ItemsPanel之後,您還有一件事要做。您還需要獲得承載您的ItemtemplateGridViewItem,並將其Visibility設置爲Collapsed

private async void Button_Click(object sender, RoutedEventArgs e) 
    { 
     ds[5].IsHidden = true; 

     await Task.Delay(1000); 
     var gridViewItem =(GridViewItem)this.gv.ContainerFromIndex(5); 
     gridViewItem.Visibility = Visibility.Collapsed; 
    } 

我放少許延遲上方,使摺疊更加明顯。

+1

感謝您給我'WrapPanel'的榮譽。你解釋這個問題做得很好。在我看來,將它從「ObservableCollection 」中刪除會給他所有他想要的東西,而沒有所有的編碼體操;但是,我看到了他對此的評論。 – 2014-12-12 00:31:21

+0

您值得信賴@JerryNixon-MSFT,否則我甚至無法回答它! :) – 2014-12-12 01:44:21

0

我嘗試了您的示例解決方案,並將其更改爲ListView。它在網格本身被隱藏時表現出相同的行爲。我沒有XAML Spy進行驗證,但似乎任何基於List的控件都會爲列表中的每個項目分配一個渲染項目。

我將您的點擊手形改爲ds.RemoveAt(5);而不是隱藏該項目,並將該元素從視圖中移除並帶有很好的動畫。這似乎與預期的一樣,並且是一個有趣的發現。

+0

看到我的更新.. – 2014-12-02 15:02:53

0

需要我花很多時間來理解問題,並且解決方案就在眼前。你試圖隱藏物品本身,但容器仍然存在,當你添加一個物品到一個GridView時,物品被包裝在物品容器中。從MSDN:

「當你添加項目到一個ItemsControl,該項目被包裝在一個 物品的容器。例如,一個項目添加到ListView被包裹在 一個ListViewItem的無UI虛擬化的。整個數據集在內存中保存爲 ,並且還爲 數據集中的每個項目創建了一個項目容器。綁定到1000個項目集合的ListView 也會創建1000個存儲在內存中的ListViewItem容器。

您需要禁用容器並創建兩個DataTemplate並使用DataTemplateSelector可以選擇哪個DataTemplate用於禁用和活動項目。 Check this useful article