WPF绑定图像源

也许是愚蠢的问题,但我不知道……

我有这样的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中的绑定看起来像这样:

      

我将ImageSource的内容设置为:

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

但它不起作用。 我认为问题在于NotifyPropertyChanged ,因为我尝试在set放置制动点并get 。 在开始时触发几次,然后使用正确的ImageSource set触发,但之后get不再触发。 就像没有任何环境发生过。

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

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

    

一个代码在后面

 MainWindowsViewModel _view = new MainWindowsViewModel(); 

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

将您的代码更改为:

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

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

  1. 检查您的Image是否已添加到项目中,并将图像的构建操作设置为Content(如果更新则复制)。
  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中的图像。 您可以使用字符串作为源并设置binded属性的资源路径:

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