Следующая проблема: У меня есть DataModel, содержащий список объектов и ссылку на выделенный объект внутри списка (между прочим) Все работает нормально - если я выбираю s. е. в ListBox он также доступен в SelectedItem - если я изменю s.th. на SelectedItem он обновляется во всем DataModel.ListBox SelectedItem не обновляет DataTemplate
.. При одном исключении: Содержимое ListBox не обновляется. Я подозреваю, что это что-то делать с DataTemplate, потому что я могу наблюдать следующее:
- если изменить SelectedItem списка элементов в DataModel обновляется соответствующим образом (проверено на Debugger - и я всегда вижу правильный данные в поле редактирования выбранного элемента)
- ListBox обновляется, если я добавляю объект из списка внутри DataModel, НО также во время этого обновления я получаю только новый элемент в ListBox, но существующие тексты не обновляются (так Список фактически отражает данные из DataModel)
- Если я перезагрузите DataModel, весь список ListBox будет восстановлен, а также отображаемые данные верны (так что нет ничего плохого в уме ч Binding источник)
Обновление: Новая информация доступна о точной задаче
Проблема на самом деле некоторые комбинации Xsd2Code и ComplexType Extensions (в XSD). Я не думаю, что это ошибка в Xsd2Code, сгенерированный код выглядит отлично.
Файл XSD используется
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="SampleRoot">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="30">
<xs:element name="SampleElement">
<xs:complexType>
<xs:complexContent>
<xs:extension base="SampleElement"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="SampleElement">
<xs:attribute name="Name" type="xs:string" use="required"/>
</xs:complexType>
</xs:schema>
Использованный DataModel (упрощенный, PropertyChanged правильно реализован, классы SampleRootSampleElement
и SampleRoot
порождаются Xsd2Code):
public class DataModel : INotifyPropertyChanged
{
public SampleRootSampleElement SelectedItem;
public SampleRoot Root;
}
Что касается XAML, ничего особенного здесь:
<ListBox Height="211" HorizontalAlignment="Left" Margin="12,12,0,0" Name="listBoxNames" VerticalAlignment="Top" Width="189" ItemsSource="{Binding Root.SampleElement}" SelectedItem="{Binding SelectedItem}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBox HorizontalAlignment="Left" Margin="12,229,0,0" Name="textBoxName" VerticalAlignment="Top" Width="189" Text="{Binding SelectedItem.Name}" />
Это комбинация n показывает описанное поведение. Чтобы устранить эту проблему, можно удалить расширение для SampleElement
внутри XSD, что снижает XSD к:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="SampleRoot">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="30">
<xs:element name="SampleElement" type="SampleElement"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="SampleElement">
<xs:attribute name="Name" type="xs:string" use="required"/>
</xs:complexType>
</xs:schema>
Все остальное остается тем же, за исключением, что нет SampleRootSampleElement
класса, порожденного (который был Удлинитель ранее). Вместо SampleElement
используется непосредственно:
public class DataModel : INotifyPropertyChanged
{
public SampleElement SelectedItem;
public SampleRoot Root;
}
Это несколько изменений делают все работает, как и ожидалось - с недостатком, что расширения не могут быть использованы. Итак, что не так в первом подходе в случае, если я хочу расширить сложные типы? Значение
Является ли ваш базовый класс, где находится свойство 'Name', реализующее интерфейс INotifyPropertyChanged? –