如何将两个可观察集合组合到Silverlight中的集合中

时间:2010-08-12 14:10:11

标签: c# wpf silverlight collections

我目前正在尝试将两个集合合并为一个用于绑定到组合框。我首先开始在一个类中构建两个静态集合:

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" };

    }

以上工作符合要求。 我现在要做的是启动对服务的查询,并将该服务的结果附加到集合而不是User1,USer2,USer3

我创建了一个对服务的查询:

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,因此使用复合集合方法似乎不是一个选项,因为不支持该类。

提前致谢

6 个答案:

答案 0 :(得分:2)

我刚看了你的评论。因为你有ObservableCollection有3个字符串和1个int。试着这样做。

让我们假设你有一个类说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.
}

}

希望这有帮助。

答案 1 :(得分:0)

也许我错过了一些东西,但是只要你的服务引用使用ObservableCollection作为它的集合类型就不应该只能迭代结果并将每个项目Add()放到this.Items上,就像你一样做了动态项目?

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);
    }
}

答案 2 :(得分:0)

我猜我错过了什么。你不能这样做吗?

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

答案 3 :(得分:0)

如果返回结果的服务是ObservableCollection类型,或者您从服务获得结果作为Observable Collection(假设您的服务返回List&lt;&gt;并且您的集合类型是ObservableCollection&lt;&gt;) 。您可以将项目附加到现有的ObservableCollection。确认“e”的返回类型是否为ObservableCollection:

右键单击ServiceReference,然后单击“配置服务引用”。如果Collection类型为List&lt;&gt ;.您无法将其添加到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
}
} 

希望这有帮助。

答案 4 :(得分:0)

感谢所有帮助过的人。以下是工作格式的最终​​解决方案。我在原始代码中遇到了一些问题。感谢Aswin Ramakrishnan间接指出我的收藏类型。当我应该从WCF端点引用原始类型时,我默认使用了observeColl。这是我收到一个错误的地方。新代码如下所示:

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事件并查询我的WCF服务以获取部门名称

 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)允许我将两个集合正确地连接在一起。 (一定要使用system.linq参考)

最后一行是将组合框项目源重新命名为新集合。

希望这有助于其他人参考。

再次感谢所有贡献。

答案 5 :(得分: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());

格雷格