2010-08-12 178 views
0

我目前正試圖將兩個集合合併爲一個用於綁定到組合框。我第一次開始在一個類中建立兩個靜態集合:如何在Silverlight中將兩個可觀察的集合合併到集合中

public partial class MainPage : UserControl 
{ 
    //create static observable collection 
    private ObservableCollection<string> items; 

    public ObservableCollection<string> Items 
    { 
     get 
     { 
      return this.items; 
     } 
     set 
     { 
      if (this.items != value) 
      { 
       this.items = value; 
      } 
     } 
    } 

    protected ObservableCollection<string> StaticItems 
    { 
     get 
     { 
      return new ObservableCollection<string>() { "Select User", "Select All" }; 
     } 
    } 

    //create dynamic observable collection 

    public MainPage() 
    { 
     InitializeComponent(); 
     this.items = this.StaticItems; 
     this.comboBox1.ItemsSource = this.Items; 
    } 

    private void UserControl_Loaded(object sender, RoutedEventArgs e) 
    { 
     foreach (var item in GetDynamicItems()) 
     { 
      this.Items.Add(item); 
     } 
    } 

    private List<string> GetDynamicItems() 
    { 
     return new List<string>() { "User1", "User2", "User3" }; 

    } 

上面的工作是按照需要的。 我想現在要做的就是initate查詢到的服務,並有追加到集合,而不是用戶1,用戶2該服務的結果,用戶3

我創建一個查詢,以服務爲:

private void FillOfficerList() 
{ 
    QueryClient qc = new QueryClient("BasicHttpBinding_IQuery"); 
    qc.GetOfficerNamesCompleted += new EventHandler<GetOfficerNamesCompletedEventArgs>(qc_GetOfficerNamesCompleted); 
    qc.GetOfficerNamesAsync(); 
} 

public void qc_GetOfficerNamesCompleted(object sender, GetOfficerNamesCompletedEventArgs e) 
{ 
    // Now how do I add e.Results to above collection? 
} 

查詢的工作原理我只是堅持如何將結果(e.Results)綁定/連接到Items集合。任何指針或提示將不勝感激。

注意:這是用於silverlight的,所以使用複合集合方法似乎不是一個選項,因爲該類不受支持。

在此先感謝

回答

2

我剛剛閱讀你的評論。由於你有3個字符串和1個int的ObservableCollection。嘗試這樣做。

讓我們假設你有一個類說myClass有3個字符串和1個int。

public class myClass() 
{ 
    string str1 {get; set;} 
    string str2 {get; set;} 
    string str3 {get; set;} 
    int int1 {get; set;} 
} 

在客戶端使用相同的數據類型創建一個ObservableCollection。

ObservableCollection<myClass> collection = new ObservableCollection<myClass>(); 


public void qc_GetOfficerNamesCompleted(object sender, GetOfficerNamesCompletedEventArgs e) 
{ 
// Now try adding this code 
for(int i=0; i<e.Result.Count;i++) 
{ 
    // I do this because, I don't want the Client class to be unaware of the class myClass 
    collection.Add(new myClass() 
      { 
      str1 = e.Result[i].str1, 
      str2 = e.Result[i].str2, 
      str3 = e.Result[i].str3, 
      int1 = e.Result[i].int1  
      }); 
} 

for(int i=0; i<collection.Count;i++) 
{ 
    Items.Add(collection[i].str1); // Add the string you want. I ve used str1 here. 
} 

} 

希望這會有所幫助。

+0

如果它幫助你解決問題,請將其標記爲答案。 – 2010-08-16 18:40:57

0

也許我失去了一些東西,但只要你的服務參考使用的ObservableCollection作爲其集合類型應該不只是能夠遍歷結果,並添加()每個項目在這個項目上,就像你對動態項目做的一樣?

public void qc_GetOfficerNamesCompleted(object sender, GetOfficerNamesCompletedEventArgs e) 
{ 
    // Now how do I add e.Results to above collection? 
    foreach(var item in e.Results) 
    { 
     this.Items.Add(item); 
    } 
} 
0

我在猜測我錯過了什麼。你不能這樣做嗎?

public void qc_GetOfficerNamesCompleted(object sender, GetOfficerNamesCompletedEventArgs e) 
{ 
    foreach (var result in e.Results) 
    { 
     Items.Add(result); 
    } 
} 
+0

,但我覺得我得到的類型 衝突返回的錯誤是: 未知的方法添加(combinedObservColls.ServiceReference1.MeOfficerName)System.Collections.ObjectModel.ObservableCollection rlcrews 2010-08-12 15:02:19

+0

Try result.ToString()? e.Results的類型是什麼?它內部的對象的類型是什麼? – RationalGeek 2010-08-12 15:22:59

+0

我認爲這是問題所在。結果返回整個collcetion。裏面有4種類型(3個字符串和1個int)。當我通常將e.result綁定到組件時,我必須在控件中使用DisplayMemberPath並調用特定字段(DisplayMemberPath =「NameLastFirst」)以便正確顯示列表。 – rlcrews 2010-08-12 17:43:06

0

如果所返回結果的服務類型的ObservableCollection,或者如果你是從服務獲得的結果作爲觀察的集合(說你的服務返回一個列表<>如果您的集合類型的ObservableCollection < >)。您可以將這些項目追加到現有的ObservableCollection中。確認「e」的返回類型是否爲ObservableCollection:

右鍵單擊ServiceReference並單擊「配置服務參考」。如果收集類型是列表<>。您不能將其添加到ObservableCollection。因此將其更改爲ObservableCollection並且如果您希望服務的返回類型也是ObservableCollection。

public void qc_GetOfficerNamesCompleted(object sender, GetOfficerNamesCompletedEventArgs e) 
{ 
// Now try adding this code 
for(int i=0; i<e.Result.Count;i++) 
{ 
    Items.Add(e.Result[i]); //Add individual item in the returning ObservableCollection to the items Collection 
} 
} 

希望這會有所幫助。

0

謝謝大家誰幫助。以下是工作格式的最終​​解決方案。我在原始代碼中遇到了一些問題。感謝Aswin Ramakrishnan間接指點我的收藏類型。當我應該從WCF端點引用原始類型時,我默認使用obserColl。這是我得到一個錯誤的地方。新代碼如下所示:

private ObservableCollection<MeDepartment> deptitems; 

    public ObservableCollection<MeDepartment> DeptItems 
    { 
     get 
     { 
      return this.deptitems; 
     } 
     set 
     { 
      if (this.deptitems != value) 
      { 
       this.deptitems = value; 
      } 
     } 
    } 

    protected ObservableCollection<MeDepartment> deptStaticItems 
    { 
     get 
     { 
      return new ObservableCollection<MeDepartment>() 
      { 
      new MeDepartment{Name = "Department"}, 
      new MeDepartment{Name = "Select All"} 
      }; 
     } 
    } 

接下來,我需要創造一個onload事件和部門名稱

private void meFilter_Loaded(object sender, RoutedEventArgs e) 
    { 
     QueryClient qc = new QueryClient("BasicHttpBinding_IQuery");  
     qc.GetDepartmentsCompleted += new EventHandler<GetDepartmentsCompletedEventArgs>(qc_GetDepartmentsCompleted); 
     qc.GetDepartmentsAsync(); 
    } 

public void qc_GetDepartmentsCompleted(object sender, GetDepartmentsCompletedEventArgs e) 
    { 
     DeptItems = new ObservableCollection<MeDepartment>(deptStaticItems.Concat<MeDepartment>(e.Result)); 
     DeptComboBox.ItemsSource = this.DeptItems; 
     DeptComboBox.SelectedIndex = 0; 
    } 

使用正確的集合類型(MeDepartment)查詢我的WCF服務,讓我再妥善地將這兩個藏品合併在一起。 (請務必使用system.linq參考)

最後一行是將組合框項目源重新命名爲新集合。

希望這可以幫助他人以備將來參考。

再次感謝所有貢獻。

0

這是一個古老的線程,但我只是有這個相同的問題,這是我想出的解決方案。

interface IMyInterface{ string TheString{get;set}} 

MyClass1 : IMyInterface {...} 

MyClass2 : IMyInterface {...} 

public ObservableCollection<IMyInterface> {get;set;} 

然後,您可以將兩種類型都添加到集合中而不會出現錯誤。

MyCollection.Add(new MyClass1()); 
MyCollection.Add(new MyClass2()); 

這是結合兩個收集和整理他們的例子:我想這

this._sortedItems = new ObservableCollection<ILookupListItemEntity>(
        LookupListItemEntities.Cast<ILookupListItemEntity>().Union(this.CustomLookupListItemEntities).OrderBy(a => a.Value).ToList()); 

格雷格