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中的CustomerDetailView
或CustomerDetailPage
将与应用程序B的相同视图不同,因为应用程序B可能对CustomerDetailView
有不同的要求。
另一方面的用户控件意味着可以跨应用程序重用,例如DatePicker
, CalendarControl
或CameraControl
。 该控件可用于可能需要相机的多个应用中。
这里重要的是,“用户控件”不了解您的应用程序结构,因此没有视图模型,没有业务/域模型等。如果您想允许ViewModels绑定到您的用户控件( ICommand
用于启动和回调例如,或将生成的图片绑定到ViewModel),然后将依赖项属性放入用户控件。
在应用程序中使用此用户控件时,只需将视图模型绑定到这些依赖项属性(DP),即可获得抽象。
TL; DR:视图中的代码隐藏不好 ,用户控件中的代码隐藏是必要的 。