Изменение содержания клеток в наблюдаемой коллекции - PullRequest
0 голосов
/ 26 апреля 2020

Работая с VB. Net WPF, у меня есть форма со списком, которая связана с наблюдаемой коллекцией. Наблюдаемая коллекция заполняется программно из веб-API, я создал кнопки для «Пометки» строк для последующего просмотра (также отображается в виде списка с колонкой «Пометить»). Я легко обновил содержимое на стороне базы данных через API. однако я изо всех сил пытаюсь обновить либо просмотр списка (кажется, что правильным шагом было бы обновить наблюдаемую коллекцию, поскольку они связаны).

Я также признал, что другой вариант - очистить наблюдаемую коллекцию (и, следовательно, список) и перезагрузите данные из 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

Спасибо за любую помощь.

1 Ответ

1 голос
/ 27 апреля 2020

Calls необходимо реализовать INotifyPropertyChanged.

ObservableCollection отправляет уведомления об изменениях всякий раз, когда элемент добавляется или удаляется, но не обрабатывает свойства изменения элемента (например, ваше Flag свойство). INotifyPropertyChanged позволяет вашему классу отправлять эти уведомления.


В отдельном примечании я согласен с комментаторами: Calls должно быть class, а не structure, для ряда причины. Вот совет от Microsoft:

Выбор между классом и структурой

✔️ СМОТРИТЕ определение структуры вместо класса, если экземпляры типа маленькие и обычно недолговечные или обычно внедряются в другие объекты.

❌ ИЗБЕГАЙТЕ определения структуры, если тип не имеет всех следующих характеристик:

  • Логически представляет одно значение , аналогично примитивным типам (int, double и т. д. c.).

  • Размер экземпляра менее 16 байт.

  • Он неизменен.

  • Его не нужно часто упаковывать.

Во всех других случаях вы должны определять свои типы как классы.

...