以下问题:我有一个 DataModel,其中包含一个对象列表和对列表中所选对象的引用(除其他外)一切正常 - 如果我选择 s.th。在 ListBox 中,它也可以在 SelectedItem 中使用 - 如果我更改 s.th。在 SelectedItem 上,它会在整个 DataModel 中更新。
..但有一个例外:列表框的内容未更新。我怀疑它与 DataTemplate 有关,因为我可以观察到以下内容:
- 如果我更改 SelectedItem,则 DataModel 中的项目列表会相应更新(在 Debugger 上检查 - 我也总是在所选项目编辑框中看到正确的数据)
- 如果我从 DataModel 内的列表中添加一个对象,则 ListBox 会更新,但在此更新期间,我只在 ListBox 中获得一个新项目,现有文本没有得到更新(因此 List 实际上反映了来自 DataModel 的数据)
- 如果我重新加载 DataModel 整个 ListBox 得到重建并且显示的数据也是正确的(所以绑定源没有任何问题)
更新:关于确切问题的新信息
问题实际上是 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}" />
这种组合显示了所描述的行为。要解决此问题,我可以删除 XSD 内部的 Extension for SampleElement
,这会将 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;
}
这几个更改使一切按预期工作 - 缺点是无法使用扩展。那么,如果我想扩展复杂类型,第一种方法有什么问题呢?