gpt4 book ai didi

wpf - 使用 {Binding .} 或 {Binding} 时数据绑定(bind)未更新

转载 作者:行者123 更新时间:2023-12-04 14:06:39 28 4
gpt4 key购买 nike

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

我的问题是,有没有办法将整个对象的更改通知 UI,以便我仍然可以使用这种语法,或者我是否需要在调用 ToString 方法的地址类型上添加 DisplayText 属性和绑定(bind)到那个?仅供引用,这是一个 MVVM 架构,所以我没有直接在 ListBox 上调用 Refresh 的奢侈。

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

  <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>

最佳答案

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

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

<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding HouseNumber}" />
<TextBlock Text=", " />
<TextBlock Text="{Binding Street}" />
<TextBlock Text=", " />
<TextBlock Text="{Binding City}" />
</StackPanel>

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

关于wpf - 使用 {Binding .} 或 {Binding} 时数据绑定(bind)未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2390037/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com