2012-04-02 45 views
1

我想將listview datacontext設置爲等於可觀察集合,以便對集合所做的更改可能反映在我的列表視圖上。我創建的可觀察集合如下:make或declare ObservableCollection <a>變量全局其中a =匿名類型

public static ObservableCollection<T> ToObservableCollection<T>(IEnumerable<T> enumeration) 
{ 
    return new ObservableCollection<T>(enumeration); 
} 

private void UserControl_Loaded(object sender, RoutedEventArgs e) 
{ 

      Entities.DatabaseModel m = new Entities.DatabaseModel(); 
      var q = from t in m.TimeSheet        
        join emp in m.Employees on t.idEmployee equals emp.id 
        where emp.id == CurrentEmploye.id 
        select new 
        { 
         firstName = emp.firstName, 
         lastName = emp.lastName, 
         position = emp.position, 
         clockInDate = t.clockInDate, 
         clockOutDate = t.clockOutDate, 
        }; 
      // here I create the observablecollection!!!!!!!!!!!!!! 
      listView1.DataContext = ToObservableCollection(q); 
} 

現在我的問題是,如果我想添加項目到ObservableCollection我該怎麼做?如果我做listView1.DataContext.Add(這將導致在錯誤

換句話說,我有方法

private void btnClockIn_Click(object sender, RoutedEventArgs e) 
    { 
     // I will like to add items to the observable collection in here 

這是我曾嘗試和它不工作:

dynamic collection; 


private void UserControl_Loaded(object sender, RoutedEventArgs e) 
{ 
     // CurrentEmploye some employee 
     Entities.DatabaseModel m = new Entities.DatabaseModel(); 
     var q = from t in m.TimeSheet        
       join emp in m.Employees on t.idEmployee equals emp.id 
       where emp.id == CurrentEmploye.id 
       select new 
       { 
        firstName = emp.firstName, 
        lastName = emp.lastName, 
        position = emp.position, 
        clockInDate = t.clockInDate, 
        clockOutDate = t.clockOutDate, 
       }; 

     collection = ToObservableCollection(q); 
} 


    private void btnClockIn_Click(object sender, RoutedEventArgs e) 
    { 

     collection.Add(new 
       { 
        firstName = "Antonio", 
        lastName = "Nam", 
        position = "Amin", 
        clockInDate = DateTime.Now, 
        clockOutDate = DateTime.Now 
       }); 
+1

你絕對需要這是一個匿名類型?查詢是否會返回與您指定的字段不同的字段? – 2012-04-02 23:49:36

+0

你是對的我只是想節省時間,因爲我需要在其他一些地方的功能,但我可能最終浪費更多的時間.. – 2012-04-03 01:23:03

+0

你有一些選擇,使用命名類型只是最快。我會發布更多細節的答案。 – 2012-04-03 01:30:19

回答

3

你可以用「絕招」它通過使用類似的「模板」匿名變量...
如代碼方法會是這樣的......

static ObservableCollection<T> CastToEnumerable<T>(this T template, object value) 
{ 
    return (ObservableCollection<T>)value; 
} 

...並使用它像這樣...

var list = new 
{ 
    firstName = "", 
    lastName = "", 
    position = "", 
    clockInDate = DateTime.MinValue, 
    clockOutDate = DateTime.MinValue 
}.CastToEnumerable(context); 
foreach (var value in list) 
{ 
} 

...它仍然是值得推薦的有一個正常的名爲類你的目的。
您可以在此處找到有關類似問題的詳細信息...
Cast to Anonymous Type
(基本上你不能返回匿名類型 - 短這樣的招數 - 「推理」的類型是什麼的背後)。

+0

沒有意識到你可以將擴展方法添加到泛型類型,棒極了。 – 2012-04-03 17:58:17

+0

你可以用靜態方法做任何事情(你可以使方法與類相同) - 只需爲第一個參數添加'this' - 雖然有點簡化。 – NSGaga 2012-04-03 18:14:52

1

在不能使用類型推斷的地方使用匿名類型是不可能的,所以你不能,例如,聲明匿名類型的類字段或屬性。但是,不明顯的是使用類型推斷,它允許您跨方法共享匿名對象。

正如我在我的評論中提到的,最簡單的選擇是使用命名類型;這將允許您將ObservableCollection<>定義爲班級變量,或者在您班級的其他地方對您的DataContext進行類型轉換。

根據您需要使用此代碼的頻率,還有第二個選項涉及將類型爲object的類型轉換爲匿名類型。這要求你知道,在你想使用匿名類型的每個地方,它具有哪些字段按什麼順序排列。它還要求在同一程序集中使用匿名類型 - 這可確保編譯器將匿名類型統一爲單個基礎類型。

如果您的要求相匹配,你可以使用一個「絕招」是這樣的:

ObservableCollection<T> Cast<T>(object obj, T typedobj) 
{ 
    return (ObservableCollection<T>)obj; 
} 

private void btnClockIn_Click(object sender, RoutedEventArgs e) 
{ 
    var temp = new 
    { 
    firstName = string.Empty, 
    lastName = string.Empty, 
    position = string.Empty, 
    clockInDate = DateTime.Min, 
    clockOutDate = DateTime.Now 
    }; 

    var collection = Cast(lstView1.DataContext, temp); 
    collection.Add(...); 
} 

讓我再說一遍,這是一個有些凌亂的「絕招」是需要多C#工具的一個不起眼的細節優勢匿名類型。這不是一個「黑客」本身,因爲行爲是由規範保證的,但是對於它的工作範圍有嚴重的限制。如果你只有一個或兩個這樣的集合,我一定會傾向於給你的類型名稱。

+0

該方法:'ObservableCollection Cast (object obj,T typedobj)'給我一個編譯錯誤說:'不能將類型'T'轉換爲'System.Collections.ObjectModel.ObservableCollection ' – 2012-04-03 17:06:16

+0

是的,在我的答案中,抱歉。類型錯誤的參數。現在修好。 – 2012-04-03 17:55:48

+0

雖然我喜歡擴展方法版本更好一點:) – 2012-04-03 17:57:54