【问题标题】:How do i bind ListView Data with List using MVVM如何使用 MVVM 将 ListView 数据与 List 绑定
【发布时间】:2015-05-15 22:30:05
【问题描述】:

我正在尝试将 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(例如黑色,初始为白色)属性也获得了新值,但它们仍然具有黑色背景。

【问题讨论】:

    标签: c# wpf listview mvvm binding


    【解决方案1】:

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

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

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

    【讨论】:

    • 值得一提的是,只有在重新实例化列表时才会更新绑定。如果您希望在列表中添加/删除项目时更新绑定,则需要使用ObservableCollection
    • 感谢您的快速答复!确实奏效了。我试图使用 List 而不是 ObservableCollection,因为我认为这会让我的视图变得非常缓慢。现在我发现它并没有什么大的区别,但你的回答仍然很有帮助。
    【解决方案2】:

    要么每次创建一个新列表,要么使用 ObservableCollection 之类的东西

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      相关资源
      最近更新 更多