在我的项目中,我有一个视图,用户可以看到具有子文件夹和图像的ImageCollections(通过MVVM和模型设置)。我想要实现的功能之一是一个小图像保持器,其中显示未看到的下一个图像。我已经在下面的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);
}
}
修改
在尝试实施Sheridan的答案之后,我有以下(我确信我在某种程度上被贬低了),这些都没有给我任何东西(或者至少在视图中没有显示任何内容。
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; }
}
答案 0 :(得分:1)
您需要在值更改时调用NotifyOfPropertyChange
,但实际上是在更改getter中的值而不是setter ...尝试创建名为UpdateNextImage
的新方法并放置代码改为确定下一个Image
:
public Image ShowNextToWatchImage
{
get
{
return _showNextToWatchImage;
}
set
{
_showNextToWatchImage = value;
UpdateNextImage();
NotifyOfPropertyChange(() => ShowNextToWatchImage);
}
}
更新&gt;&gt;&gt;
我仍然不能完全确定您的设置(如果您可以向我们显示所有您的相关代码,那就最好了),但是您说要在点击时更新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;
}
答案 1 :(得分:0)
您是否在XAML中的绑定上设置了mode=TwoWay
?所以:{Binding ShowNextToWatchImage, Mode=TwoWay}
。