2016-03-14 3 views
4

У меня небольшая проблема архитектуры с MVVM в WPF. У меня есть View, который содержит опцию для написания кода или сканирования QRCode с компьютером s camera. If user choose to not scan the code, I can bind Команда `и никаких проблем.MVVM архитектура WPF

Проблема возникает, когда пользователь выбирает сканирование qrcode. Когда пользователь нажимает код сканирования, часть экрана сбрасывается, и камера показывает на экране. Я должен сделать это в View код позади, поэтому код, который я получаю в View, который не хорош в MVVM.

Вот как View`s код выглядит следующим образом:

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?

+4

Что заставляет вас думать, что код позади в представлении плох? Совершенно нормально иметь такой код, если он выполняет работу, связанную с пользовательским интерфейсом, - вот что вы делаете. – auburg

+0

Обычно я просто пишу интерфейс для абстрактного такого внешнего ввода/вывода.Таким образом, вы получаете свойство «ICommand Scan», которое при выполнении вызывает метод «Task ReadQrCodeFromCameraAsync» на интерфейсе. В ваших модульных тестах вы выполняете ложную реализацию этого интерфейса. – Ziriax

ответ

3

Это довольно просто, как только вы овладеете им и узнаете разницу между «пользовательским элементом управления» и видом.

Первое утверждение состоит в том, что в идеале код позади должен быть пустым для представления. Это правда.

Однако это не относится к элементам управления пользователя. Элементы управления пользователя могут и должны иметь код, потому что они должны работать самостоятельно и не имеют своей логики, извлеченной в некоторый класс модели представления.

В чем разница между пользовательским элементом управления и представлением? Да, они оба в целом выводятся на UserControl, но это не делает контроль пользователя по умолчанию. Важно то, что представление представляет собой очень специфический фрагмент пользовательского интерфейса, сделанный для одной заявки, которая является очень маловероятной, которая будет использоваться повторно в другом приложении.

Например, CustomerDetailView или CustomerDetailPage в приложении А будет отличаться от того же вида для приложения В, поскольку приложение В, вероятно, будет иметь разные требования к CustomerDetailView.

Пользовательское управление с другой стороны предназначено для повторного использования в разных приложениях, например DatePicker, CalendarControl или CameraControl. Этот элемент управления можно использовать в нескольких приложениях, которым может потребоваться камера, например.

Важно, что «пользовательский элемент управления» не знает вашу структуру приложения, поэтому нет моделей просмотра, моделей бизнеса и доменов и т. Д. Если вы хотите, чтобы ViewModels связывались с вашим пользовательским элементом управления (ICommand для запуска и обратные вызовы, например, или привязать результирующий файл к ViewModel), затем вы помещаете свойства зависимостей в свой пользовательский элемент управления.

Когда вы используете этот пользовательский элемент управления в своем приложении, вы просто привязываете свою модель представления к этим свойствам зависимостей (DP), и вы получили свою абстракцию.

TL; DR: код позади в представлении является плохо, код позади в пользовательский элемент управления является необходимо.

+0

Код позади в представлении вполне нормально, пока это связано с презентацией. Ваше различие Control vs View полезно, но не привязывайте его к определенным классам. –

Смежные вопросы