使用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,因为我希望用户点击它时有所改变。
我做错了什么?
当您需要替换整个集合时,在该访问器中使用OnPropertyChanged()是很好的。但是,它不会为属性更改抛出更改。
您需要对属性本身调用OnPropertyChanged()。
更新:
此外,Observable Collections只在"添加、删除项目或刷新整个列表时"触发更新
https://msdn.microsoft.com/en-us/library/ms668604(v=vs.110).aspx