我如何使用 MVVM 将 ListView 数据与列表绑定

How do i bind ListView Data with List using MVVM

我正在尝试将 List<> 绑定到 ListView。当我更新时,我将清除列表。 ObservableCollection 上的清除有点慢。 问题是视图中的内容没有正确更新。

XAML

<StackPanel.Resources>
    <ResourceDictionary>
        <common:BoolToBackgroundConverter x:Key="BoolToBackground"/>
        <tb:StringInlineCollectionConvertor x:Key="InlineConvert"/>
    </ResourceDictionary>
</StackPanel.Resources>
<ListView ItemsSource="{Binding NotificationsCollection, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" 
            ScrollViewer.CanContentScroll="False">
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
    <ListView.ItemTemplate>
        <DataTemplate>
            <Border>
                <Grid Background="{Binding NotSeen,Converter={StaticResource BoolToBackground},UpdateSourceTrigger=PropertyChanged,NotifyOnSourceUpdated=True}">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="auto"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <Image Source="{Binding Thumb}"/>
                    <tb:BindableTextBlock InlineCollection="{Binding Text, Converter={StaticResource InlineConvert}}"/>
                    <TextBlock Text="{Binding Created}"/>
                </Grid>
            </Border>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

C# 视图模型

public List<NotificationDataModel> notificationsCollection;
public List<NotificationDataModel> NotificationsCollection
{
    get
    {
        if (notificationsCollection == null)
        {
            notificationsCollection = new List<NotificationDataModel>();
        }
        return notificationsCollection;
    }
    set
    {
        if (notificationsCollection == null)
        {
            notificationsCollection = new List<NotificationDataModel>();
        }
        notificationsCollection.Clear();
        foreach (var item in value)
        {
            notificationsCollection.Add(item);
        }
        this.OnPropertyChanged("NotificationsCollection");
    }
}

public void UpdateNotifications1()
{
    List<NotificationDataModel> newCollection = new List<NotificationDataModel>();
    newCollection.Add(item1);
    newCollection.Add(item2);
    newCollection.Add(item3);
    newCollection.Add(item4);
    newCollection.Add(item5);
    newCollection.Add(item6);
    this.NotificationsCollection = newCollection;
}

public void UpdateNotifications2()
{
    List<NotificationDataModel> newCollection = new List<NotificationDataModel>();
    newCollection.Add(item1);
    newCollection.Add(item2);
    newCollection.Add(item6);
    this.NotificationsCollection = newCollection;
}

当我调用 UpdateNotifications1 时,元素会相应显示,但之后当我调用 UpdateNotifications2 时,我看到的是 item1、item2 和 item3,而不是 item6。 在关闭视图并重新打开这些项目后,项目也获得了 NotSeen 的新值(例如黑色,初始值是白色)属性,这些项目应该是白色的,但它们仍然是黑色背景。

要么每次都创建一个新列表,要么使用类似 ObservableCollection<>

的东西

问题在于,当基础字段的实际值未更改时,在 NotificationsCollection setter 中引发 PropertyChanged 事件是无效的。目标 ItemsSource 属性 接收相同的 List 实例(来自绑定),因此不会触发 UI 更新。

所以不要清除并复制到现有集合,而是使用传递给 setter 的集合:

public List<NotificationDataModel> NotificationsCollection
{
    get { return notificationsCollection; }
    set
    {
        notificationsCollection = value;
        OnPropertyChanged("NotificationsCollection");
    }
}