2015-04-13 2 views
0

У меня есть класс, который является частью слоя ViewModel в приложении WPF C#. Происходит ошибка при создании нового объекта ObservableCollection и назначении его для this.AllPositions. Ошибка указывает, что ObservableCollection имеет некоторые недопустимые аргументы. Всплывающая подсказка для ObservableCollection указывает, что она имеет три перегруженных конструктора. Первый не получает никаких параметров. Второй принимает параметр IEnumberable<Dictionary<string,string>> collection. Третий получает List<Dictionary<string,string>> list параметр. Я пробовал множество вариаций _pRepo.GetPositions(). AsEnumerable и _pRepo.GetPositions(). ToList, но, похоже, не может сделать компилятор счастливым.ObservableCollection - недопустимые аргументы

Любая помощь была бы принята с благодарностью. Благодаря!

Edit: _pRepo.GetPositions() возвращает Systems.Collections.Generic.Dictionary<string, string> и точная ошибка Аргумент 1: не удается преобразовать из 'System.Collections.Generic.Dictionary' до 'System.Collections.Generic.IEnumerable>'

public class MalfunctionInputVM : ViewModelBase { 

     readonly PositionRepository _pRepo; 

     public ObservableCollection<Dictionary<string, string>> AllPositions { 
      get; 
      private set; 
     } 

     public MalfunctionInputVM(PositionRepository pRepo) { 

      if (pRepo == null) 
       throw new ArgumentNullException("pRepo"); 

      _pRepo = pRepo; 

      // Invalid arguments error occurs here... 
      this.AllPositions = new ObservableCollection<Dictionary<string, string>>(_pRepo.GetPositions()); 
     } 
    } 
+0

Что делает '_pRepo.GetPositions()' метод возврата? – Nico

+0

Можете ли вы добавить точное сообщение об ошибке на свой вопрос – Alex

+0

Какая ошибка исключения/компилятора? – alu

ответ

2

Точно так же как сообщение об ошибке говорится:

ObservableCollection<Dictionary<string, string>>(argument); 

ожидает аргумент одного из следующих типов для argument:

IEnumerable<Dictionary<string,string>> 
List<Dictionary<string,string>> 

То, что вы передать его в конструкторе является возвращаемым значением

_pRepo.GetPositions(); 

Какого типа

Dictionary<string, string> 

Вы не можете присвоить элемент, как если бы это была коллекция ,

Если вы хотите, чтобы словарь сам наблюдался, некоторые версии ObservableDictionary доступны, если вы используете Google для них. Если же вы действительно нуждаетесь в список, содержащий несколько словарей, и предназначены для возвращаемого значения _pRepo.GetPositions() быть первым пунктом в этой наблюдаемой коллекции, вы можете сделать:

this.AllPositions = new ObservableCollection<Dictionary<string, string>(
    new [] {_pRepo.GetPositions() }); 
0

От вашей ошибки, публикуемую в комментариях ваш метод _pRepo.GetPositions() возвращает тип Dictionary<string, string>. Теперь ваша коллекция AllPositions - это тип ObservableCollection<Dictionary<string, string>>, что означает, что это по существу List из Dictionary<string,string>.

Что вы пытаетесь сделать, это преобразовать Dictionary в список. Мое предположение было бы изменить тип коллекции из

ObservableCollection<Dictionary<string, string>>

в

ObservableCollection<KeyValuePair<string, string>>

это связано с Вами получения единого словаря из метода.

1

Вы сказали, что ваш метод GetPositions возвращает Dictionary<string, string>.Но вам нужно IEnumerable<Dictionary<string, string>>, т. Е. Список словарей.

Так что массив:

new[] { _pRepo.GetPositions() } 

В контексте:

AllPositions = new ObservableCollection<Dictionary<string, string>>(
    new[] { _pRepo.GetPositions() }); 
Смежные вопросы