首页 > 解决方案 > 更改 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

谢谢你的帮助。

标签: wpfvb.netlistview

解决方案


Calls需要实施INotifyPropertyChanged

ObservableCollection每当添加或删除项目时发送更改通知,但它不处理更改项目的属性(例如您的Flag属性)。INotifyPropertyChanged使您的班级能够发送这些通知。


另外,我同意评论员的观点:Calls应该是 aclass不是 a structure,原因有很多。以下是微软的建议:

在类和结构之间进行选择

✔️ 如果类型的实例很小且通常短暂存在或通常嵌入在其他对象中,请考虑定义结构而不是类。

❌ 避免定义结构,除非该类型具有以下所有特征:

  • 它在逻辑上表示单个值,类似于原始类型(int、double 等)。

  • 它的实例大小小于 16 个字节。

  • 它是不可变的。

  • 它不必经常装箱。

在所有其他情况下,您应该将您的类型定义为类。


推荐阅读