使用MVVM模式实时更新列表中的项目

本文关键字:项目 列表 实时更新 MVVM 模式 使用 | 更新日期: 2023-09-27 18:21:45

在我的ViewModel中有一个ObservableCollection,它在ViewModel加载时填充。

public ObservableCollection<Price> ItemPrices
{
    get
    {
        return _itemPrices;
    }
    set
    {
        _itemPrices = value;
        OnPropertyChanged("ItemPrices");
    }
}

这绑定到ListView,而ListView又包含用于布局目的的GridView。GridView中的项目包括一个图像:

<ListView ItemsSource="{Binding ItemPrices}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="" Width="auto">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Button Width="30" HorizontalAlignment="Right" Margin="5" CommandParameter="{Binding}"
                                Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.DocumentCommand}" >
                            <Image HorizontalAlignment="Center" VerticalAlignment="Center" Source="{Binding Converter={StaticResource PriceDocumentImageConverter} }" />
                        </Button>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

Source内部的Binding提供了我想在这里做什么的线索:根据绑定对象的一个属性的状态更改Image的源。我需要实时进行,这样,当用户更改适当的属性时,图像也会相应地更改。

当这个屏幕第一次加载时,它按预期工作。根据对象的状态,我可以得到正确的图像源。但是,如果我通过UI更新对象,则图像永远不会改变——即使我可以在数据库中看到对象的状态正在改变。

我正在为ItemPrices引发相应的OnPropertyChanged事件。

起初,我认为使用转换器可能是错误的方法。所以我把它换成了触发器:

<Image HorizontalAlignment="Center" VerticalAlignment="Center">
    <Image.Style>
        <Style TargetType="{x:Type Image}">
            <Setter Property="Source" Value="/Resources/Icons/Document-Add.png" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding HasDocument}" Value="True">
                    <Setter Property="Source" Value="/Resources/Icons/Document-View.png" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Image.Style>
</Image>

但这也不起作用。

所以我想我应该在保存后刷新ObservableCollection,回到数据库中获取我刚刚保存的一组新对象,但这也不起作用。

我以前也做过这样的事情,但在这些情况下,我能够处理和更新集合中的单个项目,比如SelectedItem,因为我希望用户点击它时有所改变。

我做错了什么?

使用MVVM模式实时更新列表中的项目

当您需要替换整个集合时,在该访问器中使用OnPropertyChanged()是很好的。但是,它不会为属性更改抛出更改。

您需要对属性本身调用OnPropertyChanged()。

更新:

此外,Observable Collections只在"添加、删除项目或刷新整个列表时"触发更新

https://msdn.microsoft.com/en-us/library/ms668604(v=vs.110).aspx