首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用{Binding .}或{Binding}时数据绑定未更新

使用{Binding .}或{Binding}时数据绑定未更新
EN

Stack Overflow用户
提问于 2010-03-06 05:23:27
回答 2查看 260关注 0票数 4

我有一个绑定到ListBox的地址ObservableCollection。然后在ItemTemplate中,我使用{binding.}绑定到当前地址记录。这会导致使用他们的ToString方法显示我的地址,我已经设置了该方法来格式化地址。一切都很好,除非我更新了单个地址记录上的属性,UI中的列表不会更新。向列表添加/删除不会更新UI (使用ObservableCollection行为)。如果我直接绑定到address上的属性,UI就会更新(使用Address对象的INotifyPropertyChanged行为)。

我的问题是,有没有办法将对象的更改作为一个整体通知UI,以便我仍然可以使用这种语法,或者我是否需要在调用ToString方法并绑定到该方法的address类型上平移和放置一个DisplayText属性?仅供参考,这是一个MVVM架构,所以我没有在ListBox上直接调用刷新的特权。

感谢您的任何帮助/想法。

代码语言:javascript
复制
  <ListBox x:Name="AddressList" ItemsSource="{Binding Addresses}" Background="Transparent" BorderBrush="Transparent"
   Width="200" HorizontalAlignment="Left">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <StackPanel>
          <TextBlock Text="{Binding .}" />
        </StackPanel>
      </DataTemplate>
    </ListBox.ItemTemplate>
  </ListBox>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-06 06:27:55

当您绑定到Address对象本身时,对象本身--即它的标识--不会改变,即使它的属性改变了。因此,在这种情况下,WPF不知道刷新绑定。

因此,是的,您需要绑定到通知属性(或多个属性),而不是整个对象。正如您所说,实现此目的的一种方法是创建一个DisplayText属性,并在影响显示文本的内容发生更改时引发该属性的PropertyChanged事件。另一种是在水平方向的StackPanel中使用多个TextBlocks,每个绑定到一个特定的属性,例如

代码语言:javascript
复制
<StackPanel Orientation="Horizontal">
  <TextBlock Text="{Binding HouseNumber}" />
  <TextBlock Text=", " />
  <TextBlock Text="{Binding Street}" />
  <TextBlock Text=", " />
  <TextBlock Text="{Binding City}" />
</StackPanel>

第二种方法的优点是,它使您可以灵活地在UI中更改地址的显示方式,例如多行、格式化等;缺点是,如果您有条件逻辑,例如可选的平面数字或第二个地址行,则会变得复杂。

票数 3
EN

Stack Overflow用户

发布于 2010-03-06 07:00:54

我试图重现这个问题,并成功了。

我激活了单步执行.NET调试选项,并看到如果绑定中的路径为空,则WPF不会侦听INotifyPropertyChanged。

使更改反映在列表框中的方法是替换ObservableCollection中的整个对象。这将使用Replace操作触发INotifyCollectionChanged。

但在您的情况下,这可能是不可接受的。它看起来更像是一个黑客,而不是一个可靠的解决方案。

我会认真考虑使用DataTemplate作为地址。在那里,您应该绑定到所需的确切属性(这将创建INotifyPropertyChanged的侦听器)。它比ToString()更灵活,您可能会遇到需要ToString()来处理非UI内容的情况,这会造成冲突。老实说,ToString并不是真正为UI设计的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2390037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档