WPF绑定图像源

本文关键字:图像 绑定 WPF | 更新日期: 2023-09-27 18:29:06

也许是个愚蠢的问题,但我不知道了。。。

我有这样的ViewModel类:

public class MainWindowsViewModel : INotifyPropertyChanged
{
    private ImageSource _img;
    public ImageSource StatusImage
    {
        get { return _img; }
        set
        {
            _img = value;
            NotifyPropertyChanged();
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName]String propertyName = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

XAML中的绑定如下所示:

  <Window.DataContext>
    <VM:MainWindowsViewModel />
  </Window.DataContext>
    <Image x:Name="gui_image_status" HorizontalAlignment="Left" Height="26" Margin="144,10,0,0" VerticalAlignment="Top" Width="29" Source="{Binding Path=StatusImage}" />

我将ImageSource的内容设置为:

MainWindowsViewModel _view = new MainWindowsViewModel();
        var yourImage = new BitmapImage(new Uri(String.Format("Sources/{0}.png", "red"), UriKind.Relative));
        _view.StatusImage = yourImage;

但它不起作用。我认为问题出在NotifyPropertyChanged上,因为我试着把制动点放在setget上。Get在开始时触发了几次,之后set也用正确的ImageSource触发,但之后get不再触发。就像从来没有发生过一样。

这真的很简单,我已经做了很多次类似的事情。。。我不知道为什么这次不起作用。

WPF绑定图像源

您正在创建MainWindowsViewModel类的两个实例,其中一个是在XAML中创建的

<Window.DataContext>
    <VM:MainWindowsViewModel />
</Window.DataContext>

一个在的代码后面

MainWindowsViewModel _view = new MainWindowsViewModel();

因此,您的代码在不同于视图绑定的视图模型实例上设置属性。

将您的代码更改为:

var viewModel = (MainWindowsViewModel)DataContext;
viewModel.StatusImage = new BitmapImage(...);

我在您的代码中没有发现任何问题,但您可以尝试检查一些内容。

  1. 检查您的图像是否已添加到项目中,并将图像的构建操作设置为"内容"(如果更新,则复制)
  2. 在更新ImageSource之前,调用Freeze方法以防止错误:"必须在与DependencyObject相同的线程上创建DependencySource"

    var yourImage = new BitmapImage(new Uri(String.Format("Sources/{0}.png", "red"), UriKind.Relative));
    yourImage.Freeze();
    _view.StatusImage = yourImage;
    

此外,还有一种更简单的方法可以在WPF中绑定图像。您可以使用字符串作为源,并设置绑定属性的资源路径:

public string StatusImage  
{
    get { return "/AssemblyName;component/Sources/red.png"; }
}