模型中的项目不会在视图中实时更新

本文关键字:视图 实时更新 项目 模型 | 更新日期: 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}.