模型中的项目不会在视图中实时更新
本文关键字:视图 实时更新 项目 模型 | 更新日期: 2023-09-27 18:33:55
在我的项目中,我有一个视图,用户可以在其中查看具有子文件夹和图像(通过MVVM和模型设置)的ImageCollections。我想实现的功能之一是一个小图像支架,其中显示下一个尚未看到的图像。我已经在下面的 ImageCollection 模型中设置了它,它工作得很好,但是:它不会实时更新。
我的意思是,当我单击正在查看的图像时,ShowNextToWatchImage 图像不会在视图中自动更新(如果我退出应用程序并重新启动它或重新打开文件夹,它确实会显示正确的新图像)。
我该如何解决这个问题?
在模型中:
public Image ShowNextToWatchImage
{
get
{
var found = false;
Image nextToWatchImage = null;
foreach (var folder in Folders)
{
foreach (var image in folder.Images)
{
if (!image.ImageHasBeenViewed)
{
nextToWatchImage = image;
found = true;
break;
}
nextToWatchImage = image;
}
if (found)
{
break;
}
}
return nextToWatchImage;
}
set
{
_showNextToWatchImage = value;
NotifyOfPropertyChange(() => ShowNextToWatchImage);
}
}
编辑:
在尝试实现谢里登的答案之后,我有以下内容(我确信我以某种方式犹豫不决),它们没有给我任何东西(或者至少在该项目的视图中没有显示任何内容)。
public class Collection : PropertyChangedBase
{
private Image _showNextToWatchImage;
public Collection()
{
Folders = new List<Folder>();
}
public Image ShowNextToWatchImage
{
get { return _showNextToWatchImage; }
set
{
_showNextToWatchImage = value;
UpdateNextToWatchImage();
NotifyOfPropertyChange(() => ShowNextToWatchImage);
}
}
public void UpdateNextToWatchImage()
{
var found = false;
Image nextToWatchImage = null;
foreach (var folder in Folders)
{
foreach (var image in folder.Images)
{
if (!image.ImageHasBeenViewed)
{
nextToWatchImage = image;
found = true;
break;
}
nextToWatchImage = image;
}
if (found)
{
break;
}
}
ShowNextToWatchImage = nextToWatchImage;
}
public List<Folder> Folders { get; set; }
}
当值更改时,您需要调用NotifyOfPropertyChange
,但您实际上是在更改 getter 中的值而不是 setter...尝试创建一个名为 UpdateNextImage
的新方法,并将用于确定下一个Image
的代码放入其中:
public Image ShowNextToWatchImage
{
get
{
return _showNextToWatchImage;
}
set
{
_showNextToWatchImage = value;
UpdateNextImage();
NotifyOfPropertyChange(() => ShowNextToWatchImage);
}
}
更新>>>
我仍然不能 100% 确定您的设置(最好能向我们展示所有相关代码),但您说您希望在单击Image
时对其进行更新.这让我觉得你在某处有一个点击或Command
处理程序。如果这是正确的,那么我建议你把你的下一个选择功能放在那里:
private void Image_Click(object sender, RoutedEventArgs e)
{
ShowNextToWatchImage = GetNextImage();
}
private Image GetNextImage()
{
var found = false;
Image nextToWatchImage = null;
foreach (var folder in Folders)
{
foreach (var image in folder.Images)
{
if (!image.ImageHasBeenViewed)
{
nextToWatchImage = image;
found = true;
break;
}
nextToWatchImage = image;
}
if (found)
{
break;
}
}
return nextToWatchImage;
}
<</div>
div class="answers"> 您是否在 XAML 中设置了绑定mode=TwoWay
?所以:{Binding ShowNextToWatchImage, Mode=TwoWay}
.