Приведите явную коллекцию ObservableCollection - PullRequest
0 голосов
/ 20 января 2011

У меня есть ObservableCollection объекта в C #. Этот объект реализует интерфейс. Я хотел бы иметь возможность преобразовать ObservableCollection объекта в ObservableCollection интерфейса без необходимости разбора коллекции.

Так, например:

У меня есть объект "Гитара", который реализует интерфейс под названием "IMusicalInstrument". Я связываю ObservableCollection объектов Guitar с MyListBox. Я хочу, чтобы следующая строка кода была способна конвертировать listbox itemsSource в ObservableCollection.

    ObservableCollection<IMusicalInstrument> InstrumentList = 
(ObservableCollection<IMusicalInstrument>)MyListBox.ItemsSource;

В настоящее время это дает мне InvalidCastException.

Есть ли способ сделать это (без разбора коллекции)?

Спасибо, Сет

Ответы [ 5 ]

2 голосов
/ 20 января 2011

Вы не можете разыграть его, однако один из подходов - обернуть вашу итерацию, которую, как я знаю, вы хотите избежать, но, к сожалению, не можете использовать метод расширения .

public static class CollectionExtensions
{
    public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> enumerableList)
    {
        if (enumerableList != null)
        {
            //create an emtpy observable collection object
            var observableCollection = new ObservableCollection<T>();

            //loop through all the records and add to observable collection object
            foreach (var item in enumerableList)
                observableCollection.Add(item);

            //return the populated observable collection
            return observableCollection;
        }
        return null;
    }
}

Позволить вам сделать что-то вроде ...

ObservableCollection<IMusicalInstrument> InstrumentList = MyListBox.ItemsSource.ToObservableCollection<IMusicalInstrument>();

... что я и думаю, что вы после.

Вы также можете просто передать ссылку IEnumerable<T> в конструктор ObservableCollection<T> ...

ObservableCollection<IMusicalInstrument> InstrumentList = new ObservableCollection<IMusicalInstrument>(MyListBox.ItemsSource);
1 голос
/ 20 января 2011

Извините, вы не можете этого сделать, потому что ObservableCollection<Guitar> не может рассматриваться как ObservableCollection<IMusicalInstrument> - например, Вы не можете позвонить collection.Add(new Flute()) на него.

1 голос
/ 20 января 2011

Если MyListBox.ItemsSource не является экземпляром ObservableCollection<IMusicalInstrument>, то нет, вы не можете разыграть его.

0 голосов
/ 20 января 2011

Если вы используете ObservableCollection просто для обработки измененных событий коллекции, вы можете привести к INotifyCollectionChanged и добавить свой обработчик событий. INotifyCollectionChanged не использует обобщения, поэтому вам все равно придется приводить в обработчик событий.

Однако, если вы хотите перечислить свою коллекцию экземпляров IMusicalInstrument, вы можете использовать метод расширения Linq Cast (). например,

IEnumerable<IMusicalInstrument> instruments = 
     ((IEnumerable)MyListBox.ItemsSource).Cast<IMusicalInstrument>();

Надеюсь, это поможет!

0 голосов
/ 20 января 2011

Если вы хотите просто управлять элементами коллекции, вы можете попытаться преобразовать ItemsSource в неуниверсальный IList.

...