0

以下问题:我有一个 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并由SampleRootXsd2Code 生成):

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;
}

这几个更改使一切按预期工作 - 缺点是无法使用扩展。那么,如果我想扩展复杂类型,第一种方法有什么问题呢?

4

1 回答 1

0

TextBlock由于两个可能但相关的问题,值未更新:

  • 你的Asset(不知道什么是底层类型)类没有实现INotifyPropertyChanged接口。
  • 如果您已经实现了PropertyChanged事件处理程序 -在setter中使用它:Name

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

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

应用这两个建议后,您的示例将按预期工作。

于 2014-02-12T11:53:54.687 回答