错误:即使使用Dispatcher,也必须在与DependencyObject相同的Thread上创建DependencySource

以下是我的View一部分,其中我将Image绑定到ViewModel的属性:

  

我的ViewModel是这样的:

 public class MainWindowViewModel : INotifyPropertyChanged { public BitmapImage Image { get { return _image; } set { _image = value; OnPropertyChanged(); } } Action _makeScannerAlwaysOnAction; private BitmapImage _image; public MainWindowViewModel() { AddNewPersonCommand = new RelayCommand(OpenFrmAddNewPerson); FingerPrintScannerDevice.FingerPrintScanner.Init(); MakeScannerAlwaysOn(null); } private void MakeScannerAlwaysOn(object obj) { _makeScannerAlwaysOnAction = MakeScannerOn; _makeScannerAlwaysOnAction.BeginInvoke(Callback, null); } private void Callback(IAsyncResult ar) { FingerPrintScannerDevice.FingerPrintScanner.UnInit(); var objFingerPrintVerifier = new FingerPrintVerifier(); objFingerPrintVerifier.StartVerifingProcess(); var ms = new MemoryStream(); ms.Position = 0; objFingerPrintVerifier.MatchPerson.Picture.Save(ms, ImageFormat.Png); var bi = new BitmapImage(); bi.BeginInit(); bi.StreamSource = ms; bi.EndInit(); Thread.Sleep(2000); Dispatcher.CurrentDispatcher.Invoke(() => Image = bi); //Image = bi; _makeScannerAlwaysOnAction.BeginInvoke(Callback, null); } private void MakeScannerOn() { while (true) { if (FingerPrintScannerDevice.FingerPrintScanner.ScannerManager.Scanners[0].IsFingerOn) { return; } } } public event PropertyChangedEventHandler PropertyChanged; [NotifyPropertyChangedInvocator] protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { var handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } } 

我的问题:问题是当我想绑定Image时它会给我错误

必须在与DependencyObject相同的Thread上创建DependencySource

我已经google了很多,我已经在SO中看过这个post,但它们都没有为我工作。

任何forms的帮助将非常感激。

BitmapImageDependencyObject因此它在创建它的哪个线程上很重要,因为你不能访问在另一个线程上创建的对象的DependencyProperty ,除非它是一个Freezable对象并且你可以Freeze它。

使当前对象不可修改并将其IsFrozen属性设置为true。

您需要做的是在更新Image之前调用Freeze

 bi.BeginInit(); bi.StreamSource = ms; bi.EndInit(); bi.Freeze(); Dispatcher.CurrentDispatcher.Invoke(() => Image = bi); 

正如@AwkwardCoder所指出的,这里是Freezable Objects Overview