为什么我的图片更新没有“绑定”?

时间:2016-07-06 19:43:06

标签: c# wpf image mvvm

我对我的对象“Sessions”有一个视角。在用户选择时,每个会话的图像都显示在我的GUI上的图像中。我有这个例程,在用户SelectedSession上,删除任何现有图像拍摄新图像 frameSource保存< / em>在本地,然后将私有成员变量 ImagePath设置为其路径:

    public Session SelectedSession { get { return selectedSession; } set { SetValue(ref selectedSession, value); } }
    public BitmapSource SessionImage { get { return sessionImage; } private set { SetValue(ref sessionImage, value); } }

//..
    public void TakeSessionImage(BitmapSource frameSource)
    {
        if (SelectedSession != null)
        {
            if (File.Exists(SelectedSession.ImagePath)) 
                File.Delete(SelectedSession.ImagePath); // delete old - works

            SelectedSession.ImagePath = FileStructure.CurrentSessionPath + "\\" + SelectedSession.Name + ".png"; // set ImagePath - works - Technically it does not change. I kept it if I needed later to add anything to the file name like GUID or whatever
            ImageIO.RotateAndSaveImage(SelectedSession.ImagePath, (WriteableBitmap)frameSource, -270); // save new image - works
            SessionImage = SelectedSession.LoadImageFromFile(); // binded the image to display
        }
    }

在Xaml中绑定:

<Image x:Name="currentSessionImage" Source="{Binding SessionImage}"/>

在“Session.cs”课程中:

public BitmapImage LoadImageFromFile()
{
    if (File.Exists(ImagePath)) // image path is correct
    {
        try
        {
            BitmapImage image = new BitmapImage();
            image.BeginInit();
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.UriSource = new Uri(ImagePath);
            image.EndInit();
            return image;
        }
        catch
        {
            return null;
        }
    }
    return null;
}

这已经过调试,所有语句都有效。 SessionImage是我的属性,在我的GUI上与图像“绑定”。然而,一种非常奇怪的行为正在发生:

  • 它正在删除旧的图像文件,我可以在Windows资源管理器中看到文件已经消失。
  • 正确保存新的
  • 正在从正确的路径加载新图像
  • 但是,它只显示我拍过的第一张照片。

无论我发送什么新图像。它总是显示我第一次拍摄的相同图像。有人可以帮我查一下吗?我验证了整个代码,所有值都是合乎逻辑的。任何地方都没有语法错误。

修改

protected virtual bool SetValue<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
{
    if (!EqualityComparer<T>.Default.Equals(storage, value))
    {
        storage = value;
        OnPropertyChanged(propertyName);
        return true;
    }

    return false;
}

//..

protected void OnPropertyChanged(string propertyName)
{
    try
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    catch (Exception ex)
    {

    }
}

1 个答案:

答案 0 :(得分:2)

WPF缓存从URI加载的位图。为避免这种情况,请直接从文件加载BitmapImage:

using (var fileStream = new FileStream(ImagePath, FileMode.Open, FileAccess.Read))
{
    BitmapImage image = new BitmapImage();
    image.BeginInit();
    image.CacheOption = BitmapCacheOption.OnLoad;
    image.StreamSource = fileStream;
    image.EndInit();
    return image;
}