Binding Image.Source from BitmapImage variable using INotify

本文关键字:variable using INotify BitmapImage from Image Source Binding | 更新日期: 2023-09-27 18:34:25

我想将我的 CurrentWallpaper 变量绑定到 Image.Source 并在它发生变化时更新 Image 控件。这是我的代码:

public sealed partial class MainPage : Page, INotifyPropertyChanged
{
    public BitmapImage CurrWall = new BitmapImage();
    BitmapImage CurrentWallpaper
    {
        get { return CurrWall; }
        set { CurrWall = value; OnPropertyChanged("CurrentWallpaper"); }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

在页面标签上,我添加了这个 DataContext 属性。

DataContext="{Binding RelativeSource={RelativeSource Self}}"

那是我的图像控件

<Image x:Name="CurrentWallpaperImage" Source="{x:Bind CurrWall}"/>

当我尝试设置新源时,图像控件不会更新。

StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(path);
IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read);
await CurrentWallpaper.SetSourceAsync(stream);

Binding Image.Source from BitmapImage variable using INotify

您实际上并没有为页面的 CurrentWallpaper 属性分配新值。因此,不会触发 OnPropertyChanged。

2 个选项,或者您仍然使用 SetSource 方法,但在该行之后自己调用OnPropertyChanged("CurrentWallpaper");以确保 UI 已更新。

或者使用您拥有的流创建一个新的位图图像,并将该新位图图像完全连接到您的当前壁纸。

CurrentWallpaper = newBitmapImage;

首先,将CurrentWallpaper声明为public属性

private BitmapImage currentWall = new BitmapImage();
public BitmapImage CurrentWallpaper
{
    get { return currentWall; }
    set { currentWall= value; OnPropertyChanged("CurrentWallpaper"); }
}

其次,将Binding更改为OneWay

<Image x:Name="CurrentWallpaperImage" Source="{x:Bind CurrWall, Mode=OneWay}"/>

如果在第一步或第二步后不起作用,请尝试手动引发事件

await CurrentWallpaper.SetSourceAsync(stream);
OnPropertyChanged("CurrentWallpaper");