Я только что боролся с подобной проблемой. Мой состоит из выпадающего списка, который отображается для каждого списка. DataContext верхнего уровня привязан к моей модели представления (MVVM) и выглядит следующим образом:
class ViewModel{
ObservableCollection<ComboboxListItemType> DataForTheComboBoxList;
ObservableCollection<MyDataType> DataForTheListBox;
...
}
Поскольку комбинированный список находится внутри ItemTemplate (= DataTemplate) для списка, DataContext для каждого элемента списка устанавливается на соответствующий элемент в DataForTheListBox, комбинированный блок больше не может видеть нужный DataForTheComboBoxList из DataContext верхнего уровня.
Мой (грязный, уродливый) обходной путь включает установку полного списка комбинированного списка для каждого элемента в списке, чтобы он стал видимым для DataContext в этом элементе списка.
Сначала вы создаете частичный класс для вашего типа данных списка. (Как правило, это будет исходить из справочника службы, поэтому вы не можете напрямую коснуться сгенерированного кода, не потеряв его). Этот частичный класс содержит новое свойство, относящееся к типу элемента списка в выпадающем списке:
public partial class MyDataType
{
private ObservableCollection<ComboboxListItemType> m_AllComboboxItems;
public ObservableCollection<ComboboxListItemType> AllComboboxItems
{
get { return m_AllComboboxItems; }
set
{
if (m_AllComboboxItems != value)
{
m_AllComboboxItems = value;
RaisePropertyChanged("AllComboboxItems");
}
}
}
}
Далее необходимо установить это свойство для каждого элемента в коллекции DataForTheListBox
// in ViewModel class
foreach(var x in this.DataForTheListBox)
{
x.AllComboboxItems = this.DataForTheComboBoxList;
}
Затем вернитесь в свой XAML:
<DataTemplate x:Key="ListBoxItemTemplate">
...
<Combobox
ItemsSource="{Binding AllComboboxItems}"
SelectedItem="{Binding CurrentBlah}"/>
</DataTemplate>
Не забывайте, что для того, чтобы в выпадающем списке правильно отображался текущий элемент, выбранный элемент должен ссылаться на фактический элемент в Источнике элементов в выпадающем списке. Если вы получаете данные из веб-службы, у которой есть идентификаторы или объекты, представляющие элемент для комбинированного списка, вы должны повторно сослаться на них, чтобы указать на фактическую коллекцию.