ContainerContentChanging事件和数据模型更改
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ContainerContentChanging事件和数据模型更改相关的知识,希望对你有一定的参考价值。
我正在使用GridView引发的ContentContainerChanging事件,以在我的UWP应用中渲染图像网格。该应用程序正在同步来自Web的某些数据,并且这些数据在本地存储到SQLite数据库时会呈现。我从XAML绑定到我的模型中的两个属性有几个TextBlocks。然后,我将图像逐步加载到ContentContainerChanging回调中。这对于易于渲染的数据非常有用,但是与一种方式的数据绑定直接相悖。
我对此事件的理解是,每次在屏幕上渲染该项目时都会调用它。在我的情况下,带有文本数据的模型可以在下载图像的同时提前使用。因此,他们看到了一个占位符。但是,一旦下载了映像,就无法强制再次调用ContentContainerChanging。完全下载图像后,如何告诉GridView仅重新渲染ViewPort中的项目?随着用户滚动,图像将被渲染,但是如果用户从不滚动怎么办?
我可以刷新整个ObservableCollection,但这对用户来说是一种奇怪的体验。我看到项目已删除,所有项目又被添加。从技术上讲,模型本身没有变化,只有图像。因此,这似乎很浪费。滚动位置/上下文也会丢失。
是否有办法以某种方式再次启动ContentContainerChanging并强制UI再次渲染我的图像?
如果要在下载后在GridView中显示图像,可以尝试在模型中添加path属性,并将其与Image Source绑定。该模型需要实现INotifyPropertyChanged接口并订阅PropertyChanged事件。下载图像后,您可以修改ObservableCollection并将路径传递给每个模型。在这种情况下,UI将自动更新以显示您的图像。例如:
。xaml:
<GridView x:Name="MyGridView" ItemsSource="x:Bind Lists,Mode=OneWay">
<GridView.ItemTemplate>
<DataTemplate>
<StackPanel>
<Image Source="Binding Url" Width="50" Height="50"></Image>
</StackPanel>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
。cs:
public class MyViewModel : INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged = delegate ;
public string url get; set;
public string Url
get return url;
set
url = value;
this.OnPropertyChanged();
public void OnPropertyChanged([CallerMemberName] string propertyName = null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
private ObservableCollection<MyViewModel> Lists = new ObservableCollection<MyViewModel>();
//pass the path of image
MyViewModel v = Lists[0];
v.Url = "https://picsum.photos/48?image=883";
感谢@Faywang。您建议绑定到LocalCache映像的完整路径的建议对我来说效果很好。加上x:Phase似乎就像重写ContainerContentChanging事件一样工作。
以上是关于ContainerContentChanging事件和数据模型更改的主要内容,如果未能解决你的问题,请参考以下文章