2014-02-12 3 views
0

Следующая проблема: У меня есть 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; 
} 

Это несколько изменений делают все работает, как и ожидалось - с недостатком, что расширения не могут быть использованы. Итак, что не так в первом подходе в случае, если я хочу расширить сложные типы? Значение

+1

Является ли ваш базовый класс, где находится свойство 'Name', реализующее интерфейс INotifyPropertyChanged? –

ответ

0

TextBlock не была обновлена ​​из двух возможных, но связанные с этим вопросы:

  • Ваш Asset (не знаю, что это базовый тип) класс не реализует интерфейс INotifyPropertyChanged.
  • Если вы реализовали PropertyChanged обработчик событий - использовать его в Name сеттер:

public string Name 
{ 
    get 
    { 
     return this.name; 
    } 

    set 
    { 
     this.name = value; 
     this.OnPropertyChanged("Name"); 
    } 
} 

После применения обоих предложений вы получите ваш пример работает, как ожидалось.

+0

Фактически OnPropertyChanged существует и вызывается. Проблема заключается в том, что PropertyChanged-Handler имеет значение null (поэтому нет соединения). DataModel - это btw, сгенерированный XSD2Code с включенным DataBinding, поэтому было бы запутать все. Я пытаюсь воссоздать проблему в приведенном ниже примере. –

+1

@PhilippWendt Итак, проблема в генераторе XSD2Code. Я использовал ваш «xaml» с соответствующим классом «Asset», и он работает как ожидается - значение обновляется. –

+0

Ты прав. Что-то не так, если я использую расширения в XSD. Не уверен, что. Поскольку проблема в основном такая же, я обновлю вопрос. –

Смежные вопросы