MVVM架构WPF

我在WPF中有一个MVVM架构问题。 我有View包含写一些代码或用计算机s camera. If user choose to not scan the code, I can bind扫描QRCode选项s camera. If user choose to not scan the code, I can bind s camera. If user choose to not scan the code, I can bind Command`并且没有问题。

当用户选择扫描qrcode时会出现问题。 当用户按下扫描代码时,部分屏幕正在折叠,并且摄像头显示在屏幕上。 我必须在后面的View代码中执行它,所以我在View中获得的代码在MVVM中并不好用。

这里View的代码如下:

 private void Scan_Click(object sender, RoutedEventArgs e) { if (_finalVideo.IsRunning) { _finalVideo.Stop(); } _finalVideo = new VideoCaptureDevice(_cameraDevices[CamerasList.SelectedIndex].MonikerString); _finalVideo.NewFrame += (s, a) => { try { System.Drawing.Image img = (Bitmap)a.Frame.Clone(); var ms = new MemoryStream(); img.Save(ms, ImageFormat.Bmp); ms.Seek(0, SeekOrigin.Begin); var bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.StreamSource = ms; bitmapImage.EndInit(); bitmapImage.Freeze(); Dispatcher.BeginInvoke(new ThreadStart(() => { CameraStream.Source = bitmapImage; ReadQrCode(bitmapImage); })); } catch { //exc } }; _finalVideo.Start(); } 

我如何用MVVM解决这个问题?

这很简单,一旦你掌握它并知道“用户控件”和视图之间的区别。

第一个声明是,理想情况下,视图背后的代码应为空。 这是真的。

但是,这不适用于用户控件。 用户控件可以并且应该具有代码,因为它们需要自我维持并且不将其逻辑提取到某个视图模型类中。

那么用户控件和视图之间的区别是什么? 是的,它们通常都派生在UserControl ,但默认情况下这不会使视图成为用户控件。 重要的是,视图是为一个应用程序制作的非常具体的UI, 不太可能在其他应用程序中重用。

例如,应用程序A中的CustomerDetailViewCustomerDetailPage将与应用程序B的相同视图不同,因为应用程序B可能对CustomerDetailView有不同的要求。

另一方面的用户控件意味着可以跨应用程序重用,例如DatePickerCalendarControlCameraControl 。 该控件可用于可能需要相机的多个应用中。

这里重要的是,“用户控件”不了解您的应用程序结构,因此没有视图模型,没有业务/域模型等。如果您想允许ViewModels绑定到您的用户控件( ICommand用于启动和回调例如,或将生成的图片绑定到ViewModel),然后将依赖项属性放入用户控件。

在应用程序中使用此用户控件时,只需将视图模型绑定到这些依赖项属性(DP),即可获得抽象。

TL; DR:视图中的代码隐藏不好 ,用户控件中的代码隐藏是必要的