У меня довольно простой вопрос относительно WPF. Я искал вокруг, но пока не нашел "Ответ" ...
Я бы хотел сделать двухуровневую привязку данных. Упрощенно, у меня есть Персона с некоторыми атрибутами, которая также имеет N Адресов, каждый из которых имеет некоторый тип и с некоторым Почтовым индексом (оба выбираются из комбо).
Я получаю следующие данные с сервера:
public List<AddressType> AddressTypeList; // catalogue of Address Types
public List<ZipCode> ZipCodeList; // catalogue of Zip Codes
public Person Person; // Person object
public List<Address> PersonAddressList; // Address List for that person (each has AddresType and ZipCode property)
Теперь я хотел бы связать эти данные с некоторыми элементами управления. Итак, я поместил эти свойства в некоторый пользовательский класс (скажем, Data) и установил свойство DataContext основного пользовательского элемента управления для этого объекта:
data = new Data();
data.AddressTypeList = dao.GetAll<AddressType>();
data.ZipCodeList = dao.GetAll<ZipCode>();
data.Person = dao.GetPerson();
data.PersonAddressList = dao.GetPersonAddressList(Person);
this.DataContext = data; // this == some parent UserControl
Теперь моя часть XAML для списка адресов выглядит примерно так:
<ListBox Name="listBoxAddressList" ItemsSource="{Binding PersonAddressList}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<ComboBox ItemsSource="{Binding AddressTypeList}" SelectedItem="{Binding AddressType}"/>
<TextBox Text="{Binding Address}"/> <!-- this works! -->
<ComboBox ItemsSource="{Binding ZipCodeList}" SelectedItem="{Binding ZipCode}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Свойство Address связывается нормально, а вот AddressTypeList и ZipCodeList нет. Это логично, поскольку PersonAddress (в PersonAddressList) не имеет этого свойства (они находятся на другом уровне!). Я не хочу помещать весь список AddressTypes и ZipCodes в каждый адресный объект, я хотел бы наиболее безболезненно связать его с «родителем» или передать его каждому объекту списка адресов как-то в XAML.
Я думаю, что это обычный запрос иметь каталог некоторых значений в комбо (один список), но одно из них выбрано, и это значение привязано к свойству другого объекта. Как это будет сделано правильно?