ObservableCollection中的项目不更新视图

时间:2009-08-31 22:10:56

标签: wpf xaml binding observablecollection

我在这里难过。我有一个可观察的集合,用于存放业务对象。我把它绑定到ListBox的ItemsSource。我正在更新我的对象的X和Y,它在运行时在UI中正确显示,因为它绑定了Item top和Left。但是,这就是问题所在。我还绑定了一些要在textblock文本属性中显示的数据,数据只显示初始值。无论我改变多少次,它都不会更新文本块文本。

这是XAML。如果您发现XAML有问题,请告诉我。就像我说的那样,X / Y - Top / Left绑定工作正常并且在更改时更新,绑定到DisplayData的TextBlock不会。

此外,我的集合中的业务对象确实实现了INotifyPropertyChanged。

如果仅通过查看XAML无法给出答案,我将尝试制作一个小型演示来复制此内容。

<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="614" Width="674">

<ListBox Name="PlottingBox" Background="White">

    <ListBox.ItemTemplate>

        <DataTemplate>

            <TextBlock Text="{Binding Path=DisplayData}" />

        </DataTemplate>

    </ListBox.ItemTemplate>

    <ListBox.Template>

        <ControlTemplate TargetType="{x:Type ListBox}">

            <Border Background="{TemplateBinding Background}"

                BorderBrush="{TemplateBinding BorderBrush}"

                BorderThickness="{TemplateBinding BorderThickness}">

                <Canvas IsItemsHost="True" />

            </Border>

        </ControlTemplate>

    </ListBox.Template>

    <ListBox.ItemContainerStyle>

        <Style TargetType="{x:Type ListBoxItem}">

            <Setter Property="Canvas.Left" Value="{Binding Path=PlotX}" />

            <Setter Property="Canvas.Top" Value="{Binding Path=PlotY}" />

         </Style>

    </ListBox.ItemContainerStyle>

</ListBox>

3 个答案:

答案 0 :(得分:5)

我认为问题在于背后的代码。您的XAML绝对合法且看起来不错。但在发布源代码之前,请确保满足以下条件:

  1. 您的业务对象实现INotifyPropertyChanged接口每次更改DisplayData值时都会引发PropertyChanged事件。

  2. 没有拼写错误。既不在DipslayData属性定义中也不在PropertyChangedEventArgs中传递“DispayData”属性名称。

  3. ListBoxItem的DataContext属于您的业务对象的类型。请使用Snoop进行检查。

  4. 运行时没有绑定错误。在调试中运行您的应用程序并检查“输出”窗口。您也可以使用Snoop进行检查。

  5. 希望在完成此检查清单后,您将得到答案。

    干杯:)

答案 1 :(得分:1)

您的业务对象需要实现INotifyPropertyChanged接口,以便向UI通知更改并可以更新以反映新值

答案 2 :(得分:0)

嗯,ListBox中的DataContext是ItemsSource列表的一个项目。

例如,如果ListBox被绑定到ObservableCollection,则ListBox内的DataContext将是Person对象,而不是父对象的datacontext。

如果你有一个带绑定的TextBlock,绑定将指向一个Person对象,换句话说,就是personInstance.DisplayData而不是parentDC.DisplayData。

我不知道没有ItemsSource的行为。

也许你知道这一点,但也许这会对你有帮助。

相关问题