我目前正在尝试将两个集合合并为一个用于绑定到组合框。我首先开始在一个类中构建两个静态集合:
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,因此使用复合集合方法似乎不是一个选项,因为不支持该类。
提前致谢
答案 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());
格雷格