2010-08-12 112 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()); 

格雷格