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

时间:2013-10-03 10:03:02

标签: c# wpf xaml mvvm inotifypropertychanged

在我的项目中,我有一个视图,用户可以看到具有子文件夹和图像的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; }
    }

2 个答案:

答案 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}