【问题标题】:Items in ObservableCollection not updating the viewObservableCollection 中的项目不更新视图
【发布时间】:2010-11-24 11:35:16
【问题描述】:

我被难住了。我有一个包含业务对象的可观察集合。我将它绑定到 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>

【问题讨论】:

    标签: wpf xaml binding observablecollection


    【解决方案1】:

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

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

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

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

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

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

    干杯:)

    【讨论】:

    • Anvaka,感谢您查看此内容。 1. 是的。 2. 检查并确定。 3. 还没有检查。 4.没有装订错误。我创建了一个小应用程序来复制这种情况,并且这个小应用程序运行良好。所以你是绝对正确的,它必须在我的代码隐藏中。我会搜索代码并报告回来。再次感谢。
    • 安瓦卡你是对的。问题出在我的代码隐藏中。一个愚蠢,愚蠢的问题。在 Sub New 之后,我从未更新 DisplayData。哦!对不起,如果我浪费了你的时间。道格
    • 很高兴你找到了答案:)。恭喜!
    【解决方案2】:

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

    【讨论】:

    • 是的,我在上面说过。
    【解决方案3】:

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

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

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

    我不知道没有 ItemsSource 的行为。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 2015-04-09
      • 2011-08-25
      • 2021-04-19
      相关资源
      最近更新 更多