2012-07-25 21 views
0

我不知道是否有任何「回調」Listview創建,以便我可以顯示非常具體類型的數據從我有列表。 我知道的是隻有完整列表可以綁定到ListView,但我怎麼可以像在iOS中通過Datasource Delegate所做的那樣對它進行一些檢查。Windows Metro應用程序過濾列表視圖並顯示列表中的特定數據?

有人嗎?

+0

爲什麼不只是綁定到一個空列表,然後添加到它? – mydogisbox 2012-07-25 04:10:23

+0

你能解釋一下嗎?謝謝 – Suny 2012-07-25 05:46:24

+0

也許我不明白你的意思是「完整列表」 – mydogisbox 2012-07-25 12:23:23

回答

2

過濾和分組傳統上採用CollectionViewSource。不幸的是,CollectionViewSource不再有過濾器事件或GroupDescriptions財產。看起來過濾和分組不受支持,但兩者仍然可以使用LINQ來實現。

在您的Xaml中,在頁面的參考資料部分添加一個CollectionViewSource。確保IsSourceGrouped設置爲true:

<common:LayoutAwarePage.Resources> 

    <!-- 
     Collection of grouped items displayed by this page, bound to a subset 
     of the complete item list because items in groups cannot be virtualized 
    --> 
    <CollectionViewSource x:Name="GroupsCV" Source="{Binding Groups}" IsSourceGrouped="True" /> 

</common:LayoutAwarePage.Resources> 

現在,CollectionViewSource(GroupsCV)應該爲你的GridView被設置爲的ItemsSource:

<GridView ItemsSource="{Binding Source={StaticResource GroupsCV}}" /> 

注意CollectionViewSource綁定到屬性爲。這個屬性是我的ViewModel的一部分。由屬性返回的值將是LINQ查詢的結果。起初我很困惑,因爲我不知道型號屬性應該返回。我解決了一系列可比項目。這幾乎適用於任何類型的任何LINQ查詢。

所以,在您的視圖模型(或任何你的DataContext是)添加以下屬性:

private IEnumerable<IGrouping<IComparable, TItem>> groups; 
public IEnumerable<IGrouping<IComparable, TItem>> Groups 
{ 
    get { return groups; } 
    set { SetProperty(ref groups, value); } 
} 

現在,每當你想改變分組或過濾器,只需設置組屬性等於LINQ查詢像這樣:

Groups = from i in musicItems 
      group i by i.Genre into g 
      orderby g.Key 
      select g; 

LINQ確實很大已知屬性名稱,而是從屬性名稱的列表,讓用戶選擇,並動態地由物業分組什麼?那麼,LYNQ能夠創建一個組的唯一要求是,無論你通過它,它必須實現IComparable

這裏有一個小的擴展方法,它的屬性以字符串形式的名稱,並返回一個IComparable的

static public IComparable GetComparableValue<T>(this T item, string propName) where T : class 
{ 
    return (IComparable)typeof(T).GetTypeInfo().GetDeclaredProperty(propName).GetValue(item, null); 
} 

有了到位,你可以通過這樣的屬性名做一個動態查詢:

string groupByPropertyName = "Artist"; 

Groups = from i in musicItems 
group i by i.GetComparableValue(groupByPropertyName) into g 
orderby g.Key 
select g; 

希望幫助!

+0

PS我正在展示如何在那裏創建組,但是你也可以很容易地進行過濾。在查詢的第二行(from之後的行)添加一個where子句。任何屬性,甚至應該能夠使用GetComparableValue技巧動態過濾屬性名稱。 – 2012-07-30 20:58:04

+0

謝謝jared .. !! – Suny 2012-08-01 05:09:29

1

我並不是100%確定你想要解決的確切情況,但是有辦法在現有數據源上創建過濾視圖。你也不會說這是XAML還是JavaScript。我要回答JavaScript部分。

顯然,你可以重新包裝你想要的表單。

您也可以選擇一些其他選項:

  • 使用WinJS.Binding.List,與createFilter方法一起。請參閱:

http://msdn.microsoft.com/en-us/library/windows/apps/Hh700774.aspx

http://msdn.microsoft.com/en-us/library/windows/apps/hh465496.aspx

http://msdn.microsoft.com/en-us/library/windows/apps/hh700741.aspx

http://msdn.microsoft.com/en-us/library/windows/apps/hh465464.aspx

+0

dhopton它的XAML和C#。我沒有使用JS。你能否提供幫助? – Suny 2012-07-25 05:34:00

+0

這只是一個普通的IList類型的API,您應該可以執行正常的C#-y,WPF-y方法來完成所有這些工作。在這方面沒有我的經驗:( – 2012-07-25 17:26:59

相關問題