Как объединить две наблюдаемые коллекции в коллекцию в Silverlight - PullRequest
0 голосов
/ 12 августа 2010

В настоящее время я пытаюсь объединить две коллекции в одну для привязки к комбинированному списку.Сначала я начал с двух статических коллекций, построенных внутри класса:

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 ]

2 голосов
/ 14 августа 2010

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

Предположим, у вас есть класс, скажем, myClass, который имеет 3 строки и 1 целое.

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 голосов
/ 01 июня 2013

Это старая ветка, но у меня возникла та же проблема, и это решение, которое я придумала.

interface IMyInterface{ string TheString{get;set}}

MyClass1 : IMyInterface {...}

MyClass2 : IMyInterface {...}

public ObservableCollection<IMyInterface> {get;set;}

Затем вы можете добавить оба типа в коллекцию без ошибки.1004 *

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

Это пример объединения двух коллекций и их сортировки:

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

Грег

0 голосов
/ 16 августа 2010

Спасибо всем, кто помог. Ниже приведено окончательное решение в рабочем формате. У меня было несколько проблем в оригинальном коде. Спасибо Асвину Рамакришнану за косвенное указание на мои типы коллекций. Я по умолчанию установил usins ​​наблюдающий вызов, когда должен был ссылаться на исходные типы из конечной точки 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 голосов
/ 14 августа 2010

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

Щелкните правой кнопкой мыши ServiceReference и выберите Configure Service Reference. Если Тип коллекции - Список <>. Вы не можете добавить его в 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 голосов
/ 12 августа 2010

Полагаю, я что-то упустил.Вы не можете просто сделать это?

public void qc_GetOfficerNamesCompleted(object sender, GetOfficerNamesCompletedEventArgs e)
{
    foreach (var result in e.Results)
    {
        Items.Add(result);
    }
}
0 голосов
/ 12 августа 2010

Может быть, я что-то упускаю, но если ваша ссылка на службу использует ObservableCollection в качестве типа коллекции, разве вы не сможете просто перебирать результаты и добавлять () каждый элемент в 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...