在WPF和MVVM中使用ObservableCollections

时间:2015-12-10 15:55:34

标签: wpf mvvm observablecollection

我对WPF很新,并且仍然试图了解如何使用内置函数执行某些操作,而不是再次发明轮子。

今天我偶然发现了一个问题,我无法通过内置函数解决这个问题以及我可以想到的可能的方法,我并不是很喜欢。所以希望你可以指出我正确的方向,甚至可以用内置函数命名一个聪明的方法。

因此,为了简单起见,我们说我想为MailMessage命名空间中的System.Net.Mail类编写一个ViewModel。

Imports System.Collections.ObjectModel
Imports System.Net.Mail

Public Class MailMessageViewModel
    Private _message As MailMessage

    ...

End Class

MailMessage对象(等等)包含To类型的属性MailAddressCollection,其中包含我的电子邮件的所有收件人MailAddress个对象。

在我的ViewModel中,我将这个MailAddress个对象的集合包装到一个ObservableCollection中。

这是我的第一个问题,我该怎么做。我使用:

    Public ReadOnly Property Recipients As ObservableCollection(Of MailAddress)
        Get
            Return New ObservableCollection(Of MailAddress)(_message.To)
        End Get
    End Property

或者我是否使用:

Private _recipients As ObservableCollection(Of MailAddress)
Public ReadOnly Property Recipients As ObservableCollection(Of MailAddress)
    Get
        If _recipients Is Nothing Then
            _recipients = New ObservableCollection(Of MailAddress)(_message.To)
        End If

        Return _recipients
    End Get
End Property

我的视图模型现在具有可绑定属性Recipients

现在,我希望能够从To的{​​{1}}集合中删除电子邮件地址。 但是当我从MailMessage删除地址时,我的UI会得到正确更新,但ObservableCollection集合保持不变。如果我直接从To的{​​{1}}集合中删除To,那么我的用户界面就不会反映这些变化。

我是否真的必须使用MailMessage事件手动连接ObservableCollection和相应的源集合,或者两次执行所有更改(在ObservableCollection和真实集合中) ?或者是否有任何我不知道的聪明的WPF方式?

2 个答案:

答案 0 :(得分:2)

不要“包装”任何东西。

只需创建一个包含发送邮件消息所需属性的视图模型。

在将来的某个时刻,您实际上将发送消息。例如,用户单击“发送”按钮可在某处触发ICommand。 目前,将您的ViewModel 转换为 MailMessage

如果没有 lot 代码,您无法将一个集合“包装”在另一个集合中。将属性值从一种类型的实例复制到另一种类型的实例只需要几分钟。

答案 1 :(得分:1)

如果更改总是从ObservableCollection转到原始列表,我认为您可以向' CollectionChanged'添加处理程序。 ObservableCollection的事件。我认为这样做会不会那么繁重。

AddHandler Recipients.CollectionChanged, AddressOf RecipientsCollChanged

...

Private Sub RecipientsCollChanged(sender As Object, e As NotifyCollectionChangedEventArgs)
    If e.OldItems IsNot Nothing Then
        For Each elem In e.OldItems
            _message.To.Remove(elem)
        Next
    End If
End Sub

显然,如果需要,您还可以使用NotifyCollectionChangedEventArgs参数中的信息处理修改和添加元素到ObservableCollection中。