我在这里难过。我有一个可观察的集合,用于存放业务对象。我把它绑定到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>
答案 0 :(得分:5)
我认为问题在于背后的代码。您的XAML绝对合法且看起来不错。但在发布源代码之前,请确保满足以下条件:
您的业务对象实现INotifyPropertyChanged接口和每次更改DisplayData值时都会引发PropertyChanged事件。
没有拼写错误。既不在DipslayData属性定义中也不在PropertyChangedEventArgs中传递“DispayData”属性名称。
ListBoxItem的DataContext属于您的业务对象的类型。请使用Snoop进行检查。
运行时没有绑定错误。在调试中运行您的应用程序并检查“输出”窗口。您也可以使用Snoop进行检查。
希望在完成此检查清单后,您将得到答案。
干杯:)
答案 1 :(得分:1)
您的业务对象需要实现INotifyPropertyChanged
接口,以便向UI通知更改并可以更新以反映新值
答案 2 :(得分:0)
嗯,ListBox中的DataContext是ItemsSource列表的一个项目。
例如,如果ListBox被绑定到ObservableCollection,则ListBox内的DataContext将是Person对象,而不是父对象的datacontext。
如果你有一个带绑定的TextBlock,绑定将指向一个Person对象,换句话说,就是personInstance.DisplayData而不是parentDC.DisplayData。
我不知道没有ItemsSource的行为。
也许你知道这一点,但也许这会对你有帮助。