3

我被难住了。我有一个包含业务对象的可观察集合。我将它绑定到 ListBox 的 ItemsSource。我正在更新对象的 X 和 Y,并且它在运行时在 UI 中正确显示,因为它绑定了项目的顶部和左侧。但是,这就是问题所在。我还绑定了一些数据以显示在 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>

4

3 回答 3

5

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

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

  2. 没有错别字。在 DipslayData 属性定义和 PropertyChangedEventArgs 中都没有,您在其中传递“DispayData”属性名称。

  3. ListBoxItem 的 DataContext 属于您的业务对象的类型。用Snoop检查它。

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

希望在完成这份清单后你会得到答案。

干杯:)

于 2009-08-31T22:37:51.733 回答
1

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

于 2009-08-31T22:15:48.237 回答
0

嗯,ListBox里面的DataContext就是ItemsSource列表中的一项。

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

如果您有一个带有绑定的 TextBlock,则该绑定将指向一个 Person 对象,即 personInstance.DisplayData 而不是 parentDC.DisplayData。

我不知道没有 ItemsSource 的行为。

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

于 2009-08-31T23:08:24.683 回答