2010-08-12 3 views
0

В настоящее время я пытаюсь объединить две коллекции в одну для привязки к combobox. Я сначала начал с двух статических коллекций, построенных в пределах одного класса:Как объединить две наблюдаемые коллекции в коллекции 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, 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, поэтому использование подхода с коллективными коллекциями не представляется возможным, поскольку класс не поддерживается.

Заранее спасибо

ответ

2

Я просто прочитал ваш комментарий. Поскольку у вас есть ObservableCollection с 3 строками и 1 int. Попытайтесь это сделать.

Предположим, что у вас есть класс say 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

Отметьте это как ответ, если это поможет решить эту проблему. –

0

Может быть, я что-то не хватает, но до тех пор, как ваша справочная служба использует ObservableCollection в качестве типа коллекции не должны просто быть в состоянии перебрать результатов и Add() каждый элемент на это. Как и в случае с динамическими элементами?

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

я попытался это, но я думаю, что я получаю конфликт типов Обнаружена ошибка является: Неизвестный метод Добавить (combiningObservColls.ServiceReference1.MeOfficerName) из System.Collections.ObjectModel.ObservableCollection rlcrews

+0

Попробуйте результат. ToString()? Каков тип e.Results? И каков тип объектов внутри него? – RationalGeek

+0

Я думаю, что это проблема. Результат возвращает весь конфликт. который имеет 4 типа внутри него (3 строки и 1 из int). Когда я обычно привязываю e.result к компоненту, я должен использовать DisplayMemberPath внутри элемента управления и вызывать конкретное поле (DisplayMemberPath = «NameLastFirst»). Таким образом, отображается правильный список. – rlcrews

0

Если служба, которая возвращает результат имеет тип ObservableCollection или если вы получаете результат от службы в наблюдаемом Collection (Say ваша служба возвращает список <> и если ваш тип коллекции является ObservableCollection < >). Вы можете добавить элементы к существующему ObservableCollection. Чтобы подтвердить, является ли возвращаемый тип «e» ObservableCollection:

Щелкните правой кнопкой мыши службу ServiceReference и нажмите «Настроить сервисную ссылку». Если тип коллекции - List <>. Вы не можете добавить его в 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

Спасибо всем, кто помог. Ниже приведено окончательное решение в рабочем формате. У меня было несколько проблем в исходном коде. Спасибо Асвину Рамакришнану за косвенное указание на мои коллекции.Я по умолчанию использовал usins ​​obserColl, когда я должен был ссылаться на исходные типы из конечной точки WCF. Здесь я получил одну ошибку. Новый код выглядит следующим образом:

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)

Последняя строка должна была перевести источник элементов со списком в новую коллекцию.

Надеюсь, что это поможет другим людям в будущем.

еще раз спасибо за все, что внесли вклад.

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

Грег

Смежные вопросы