wpf - 更改 observablecollection 中的单元格内容
问题描述
使用 VB.Net WPF,我有一个带有 listview 的表单,它数据绑定到 observablecollection。可观察的集合是从基于 Web 的 API 以编程方式填充的,我为“标记”行创建了按钮以供稍后查看(也显示在带有“标记”列的列表视图上。我通过 api 轻松更新了数据库端的内容但是我正在努力更新列表视图(似乎正确的举动是更新 observablecollection,因为它们已绑定)。
我还认识到另一种选择是清除 observablecollection(以及列表视图)并从 api 重新加载数据,但理想情况下,我想让列表视图专注于在更改数据之前选择的项目。
在这里:XAML
<ListView x:Name="QALog" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="795" Margin="10,100,0,0" VerticalAlignment="Top" Width="1472" ItemsSource="{Binding}" FontSize="14">
<ListView.View>
<GridView>
<GridViewColumn Header="Id" Width="20" DisplayMemberBinding="{Binding Id}"/>
<GridViewColumn Header="Flag" Width="100" DisplayMemberBinding="{Binding Flag}"/>
<GridViewColumn Header="Date" Width="100" DisplayMemberBinding="{Binding Dateofcall}"/>
<GridViewColumn Header="Time" Width="100" DisplayMemberBinding="{Binding Timeofcall}"/>
<GridViewColumn Header="Caller" Width="175" DisplayMemberBinding="{Binding CID}"/>
<GridViewColumn Header="Service" Width="75" DisplayMemberBinding="{Binding Calltype}"/>
<GridViewColumn Header="Accepted" Width="75" DisplayMemberBinding="{Binding ETAaccepted}"/>
<GridViewColumn Header="Act. BLS" Width="75" DisplayMemberBinding="{Binding Activebls}"/>
<GridViewColumn Header="Act. ALS" Width="75" DisplayMemberBinding="{Binding Activeals}"/>
<GridViewColumn Header="Low ETA" Width="75" DisplayMemberBinding="{Binding Loweta}"/>
<GridViewColumn Header="High ETA" Width="75" DisplayMemberBinding="{Binding Higheta}"/>
<GridViewColumn Header="Details" Width="250" DisplayMemberBinding="{Binding Details}"/>
<GridViewColumn Header="Dispatcher" Width="125" DisplayMemberBinding="{Binding Userid}"/>
<GridViewColumn Header="Comments" Width="175" DisplayMemberBinding="{Binding Comments}"/>
</GridView>
</ListView.View>
</ListView>
结构 / Observablecollection
Public Structure Calls
Private _Id As String
Private _Flag As String
Private _Dateofcall As String
Private _Timeofcall As String
Private _CID As String
Private _Calltype As String
Private _ETAaccepted As String
Private _Activebls As String
Private _Activeals As String
Private _Loweta As String
Private _Higheta As String
Private _Details As String
Private _Userid As String
Private _Comments As String
Property Id() As String
Get
Return _Id
End Get
Set(ByVal Value As String)
_Id = Value
End Set
End Property
Property Flag() As String
Get
Return _Flag
End Get
Set(ByVal Value As String)
_Flag = Value
End Set
End Property
Property Dateofcall() As String
Get
Return _Dateofcall
End Get
Set(ByVal Value As String)
_Dateofcall = Value
End Set
End Property
Property Timeofcall() As String
Get
Return _Timeofcall
End Get
Set(ByVal Value As String)
_Timeofcall = Value
End Set
End Property
Property CID() As String
Get
Return _CID
End Get
Set(ByVal Value As String)
_CID = Value
End Set
End Property
Property Calltype() As String
Get
Return _Calltype
End Get
Set(ByVal Value As String)
_Calltype = Value
End Set
End Property
Property ETAaccepted() As String
Get
Return _ETAaccepted
End Get
Set(ByVal Value As String)
_ETAaccepted = Value
End Set
End Property
Property Activebls() As String
Get
Return _Activebls
End Get
Set(ByVal Value As String)
_Activebls = Value
End Set
End Property
Property Activeals() As String
Get
Return _Activeals
End Get
Set(ByVal Value As String)
_Activeals = Value
End Set
End Property
Property Loweta() As String
Get
Return _Loweta
End Get
Set(ByVal Value As String)
_Loweta = Value
End Set
End Property
Property Higheta() As String
Get
Return _Higheta
End Get
Set(ByVal Value As String)
_Higheta = Value
End Set
End Property
Property Details() As String
Get
Return _Details
End Get
Set(ByVal Value As String)
_Details = Value
End Set
End Property
Property Userid() As String
Get
Return _Userid
End Get
Set(ByVal Value As String)
_Userid = Value
End Set
End Property
Property Comments() As String
Get
Return _Comments
End Get
Set(ByVal Value As String)
_Comments = Value
End Set
End Property
End Structure
Dim CallsCollection As New ObservableCollection(Of Calls)
Public Sub New()
InitializeComponent()
QALog.DataContext = CallsCollection
End Sub
尝试重新分配显然不起作用,因为列出的分配是一个值
If QALog.SelectedItems.Count > 0 Then
Dim item = CallsCollection.FirstOrDefault(Function(i) i.CID = QALog.SelectedItem.Id)
Dim foundindex As Integer = CallsCollection.IndexOf(item)
CallsCollection(foundindex).Flag = "Review"
End If
谢谢你的帮助。
解决方案
Calls
需要实施INotifyPropertyChanged
。
ObservableCollection
每当添加或删除项目时发送更改通知,但它不处理更改项目的属性(例如您的Flag
属性)。INotifyPropertyChanged
使您的班级能够发送这些通知。
另外,我同意评论员的观点:Calls
应该是 aclass
不是 a structure
,原因有很多。以下是微软的建议:
✔️ 如果类型的实例很小且通常短暂存在或通常嵌入在其他对象中,请考虑定义结构而不是类。
❌ 避免定义结构,除非该类型具有以下所有特征:
它在逻辑上表示单个值,类似于原始类型(int、double 等)。
它的实例大小小于 16 个字节。
它是不可变的。
它不必经常装箱。
在所有其他情况下,您应该将您的类型定义为类。
推荐阅读
- python - 在我的包中导入模块的 Python 最佳实践
- reactjs - React-Typescript:如何使用条件语句编写接口
- c++ - CMake 输出到构建目录
- liferay - 如何在 Liferay 中单击时滚动到部分/片段?
- stellar.js - 恒星币交换-pathpaymentStrictReceive API 中的问题
- shopify - 未捕获的类型错误:无法读取 null 的属性(读取“添加”)
- macos - 登录 Jenkins 和日志文件有什么问题?
- amazon-web-services - 使用 S3 的 QuickSight 数据上传问题
- asynchronous - 从异步方法返回盒装特征对象时是否必须使用 Pin?
- excel - 通过条件格式 Excel 根据值的长度为值添加前缀